与Razor一起使用时,我在使用HTML Helpers时遇到困难。 所说的助手在带有Web表单视图引擎的MVC 2中运行良好。 但不是剃刀。 我在运行时遇到的错误是:
Compiler Error Message: CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
Source Error:
Line 1: @using Wingspan.Web.Mvc;
Line 2: @Html.IncrementalMenu(MenuBlock.Site)
扩展显示详细的编译器输出将显示:
d:\...\Views\Shared\MenuTop.cshtml(2,1): error CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
d:\...\Views\Shared\MenuTop.cshtml(2,7): error CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'
这向我表明razor不喜欢我的助手IncrementalMenu返回空(在MVC 2 Web表单引擎视图中正常工作)。
尽管代码行(@ Html.IncrementalMenu(...))用红色下划线标有以下消息,但在编译时我没有收到任何错误:
Cannot implicitly convert type 'void' to 'object'
IncrementalMenu在Wingspan.Web.Mvc命名空间中。 它的签名如下:
public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
// Uses an HtmlTextWriter to render a menu from the sitemap
}
如果我知道出了什么问题我就被打击了...
PS:
MenuBlock参数只是一个枚举,用于标识菜单的呈现方式。 不要专注于此,因为那很好。
您可以这样呼叫您的助手:
@{ Html.IncrementalMenu(MenuBlock.Site); }
WebForms语法
您只需调用您的方法,就会忽略返回值(如果有的话)。
这样的代码需要一个返回值,并将该返回值写入html流:
@Html.YourHelper()
Webforms语法:
如果结果值!= IHtmlString,则相同:
谢谢!! 那行得通,启发了我。 +1
附录:
您可以使用@ Html.RenderPartial得到相同或相似的错误。在这种情况下,这是由于RenderPartial直接呈现给响应,而不是字符串,因此需要在" Razor代码块"中进行编码:
@{
Html.RenderPartial(...);
}
我怀疑这是Microsoft在ASP.NET MVC中包含新的Html.Partial的原因之一。由于Html.Partial确实返回了一个字符串,因此可以这样写:
@Html.Partial
看起来好多了。考虑到Razor宣称的目标之一是轻松一点,这很可能是正确的。
这也至少使我感到舒适。我知道返回字符串是什么,我一直都这样做。但是,每次我认为"返回响应"都需要更多的大脑循环。
而且,这也符合古老的格言,微软最终将其产品正确地安装在版本3中。例如,Access 97。
这是一个令人沮丧的比喻。因为他们在版本4中搞砸了,例如Access 2000 ...
哦,我想你才救了我半个小时。 谢谢。
RenderPartial实际上并不直接呈现给响应; 如果这样做的话,将使Razor Layout混乱,首先将页面本身呈现到缓冲区,然后使用thats呈现其Layout,然后在链的父Layout上使用thats,直到不再有父Layouts。 然后,最后实际上写出了响应。 如果RenderPartial()在页面中执行时立即呈现给Response,则它将是Response中的第一件事-而是仅在缓冲输出的那一点附加一个字符串,这意味着它与@Html具有相同的效果 部分
您的HTML帮助器应返回代表html的MvcHtmlString,以便与Razor(以及其他不是WebFormsViewEngine的视图引擎)一起正常使用
public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
return MvcHtmlString.Create("" + expression +"");
}
非常感谢,这使我花了很长时间才找出来,因为我来自ASPX视图引擎...