我在使用Razor时遇到了Html帮助器的问题。上述帮助器在MVC2的web表单视图引擎中工作得很好。但不是在剃刀里。我在运行时得到的错误是:
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)
展开Show Detailed Compiler输出将显示:
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返回空(它在MVC2Web表单引擎视图中工作得很好)。
我在编译时没有得到任何错误,尽管代码行(@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参数只是标识菜单应该如何呈现的枚举。不要纠结于此,因为这是很好的。
发布于 2010-11-19 00:09:25
你可以这样调用你的助手:
@{ Html.IncrementalMenu(MenuBlock.Site); }
WebForms语法
<% Html.IncrementalMenu(MenuBlock.Site); %>
您只需调用您的方法,并且忽略返回值(如果有)。
这样的代码需要一个返回值,并将返回值写入html流:
@Html.YourHelper()
Webforms语法:
<%: Html.YourHelper() %>
同样,如果结果值!= IHtmlString:
<%= Server.HtmlEncode(Html.YourHelper()) %>
发布于 2011-02-10 03:00:51
附录:
对于@Html.RenderPartial,您可能会得到相同或类似的错误。在这种情况下,这是因为RenderPartial直接呈现给响应,所以不是字符串,需要在"Razor代码块“中进行编码:
@{
Html.RenderPartial(...);
}
我怀疑这是微软在ASP.NET MVC中包含新的Html.Partial的原因之一。由于Html.Partial确实返回字符串,因此可以这样写:
@Html.Partial
看起来好多了。鉴于Razor宣布的目标之一是让人看起来很舒服,这很可能是真的。
至少,这也让我感觉更舒服。我知道返回字符串是什么意思,我经常这样做。但是,每次我想的时候,“返回到反应”都需要更多的大脑周期。
这与一句古老的格言相吻合,即微软最终在版本3中获得了正确的产品。例如,Access 97。
这是一个令人沮丧的比喻。因为他们搞砸了版本4,也就是Access 2000...
发布于 2010-11-18 23:56:30
您的HTML helper应该返回代表html的MvcHtmlString,以便与Razor (和其他非WebFormsViewEngine的视图引擎)一起正常工作。
public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
return MvcHtmlString.Create("<label>" + expression + "</label>");
}
https://stackoverflow.com/questions/4216736
复制相似问题