awr*_*ley 63 asp.net-mvc razor asp.net-mvc-3
当与Razor一起使用时,我遇到了Html Helpers的困难.所述助手在MVC 2中与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)
Run Code Online (Sandbox Code Playgroud)
展开显示详细编译器输出显示:
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'
Run Code Online (Sandbox Code Playgroud)
这向我表明剃刀不喜欢我的助手,IncrementalMenu,返回void(在MVC 2 Web表单引擎视图中工作正常).
我在编译时没有出现任何错误,尽管代码行(@ Html.IncrementalMenu(...))带有以下消息的红色下划线:
Cannot implicitly convert type 'void' to 'object'
Run Code Online (Sandbox Code Playgroud)
IncrementalMenu位于Wingspan.Web.Mvc命名空间中.它的签名如下:
public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
// Uses an HtmlTextWriter to render a menu from the sitemap
}
Run Code Online (Sandbox Code Playgroud)
如果我知道什么是错的,我会被打击
PS:
MenuBlock参数只是一个枚举,用于标识菜单应如何呈现.不要因为这很好而注意这一点.
GvS*_*GvS 85
你可以这样打电话给你的助手:
@{ Html.IncrementalMenu(MenuBlock.Site); }
Run Code Online (Sandbox Code Playgroud)
WebForms语法
<% Html.IncrementalMenu(MenuBlock.Site); %>
Run Code Online (Sandbox Code Playgroud)
您只需调用您的方法,并忽略返回值(如果有).
像这样的代码需要返回值,并将返回值写入html流:
@Html.YourHelper()
Run Code Online (Sandbox Code Playgroud)
Webforms语法:
<%: Html.YourHelper() %>
Run Code Online (Sandbox Code Playgroud)
同样,如果结果值!= IHtmlString:
<%= Server.HtmlEncode(Html.YourHelper()) %>
Run Code Online (Sandbox Code Playgroud)
awr*_*ley 49
您可以使用@ Html.RenderPartial获得相同或类似的错误.在这种情况下,由于RenderPartial直接呈现给Response,因此不是字符串,需要在"Razor代码块"内编码:
@{
Html.RenderPartial(...);
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这是微软在ASP.NET MVC中包含新Html.Partial的原因之一.由于Html.Partial确实返回一个字符串,因此可以写:
@Html.Partial
Run Code Online (Sandbox Code Playgroud)
哪个看起来好多了.鉴于Razor声明的目标之一是易于实现的,这很可能是真的.
这也有点让我感到更舒服.我知道返回一个字符串是什么,我一直这样做.但是"回到响应"每次我想的时候都需要更多的脑循环.
它符合最终微软在版本3中获得产品的古老格言.EG,Access 97.
这是一个令人沮丧的明喻.他们在第4版搞砸了,即Access 2000 ......
Ata*_*hev 22
您的HTML帮助器应该返回代表html的MvcHtmlString,以便与Razor(以及不是WebFormsViewEngine的其他视图引擎)一起正常工作
public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
return MvcHtmlString.Create("<label>" + expression + "</label>");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43985 次 |
| 最近记录: |