ASP.NET MVC:自定义HTML佣工剃刀
-
26-09-2019 - |
题
我正在与剃刀使用时具有HTML辅助困难。说佣工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)
展开详细编译器输出显示揭示了:
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'
这表明,我认为剃刀不喜欢我的帮手,IncrementalMenu,返回void(工作在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.IncrementalMenu(MenuBlock.Site); %>
您只需拨打你的方法,并返回值(如果有的话)将被忽略。
这样的代码需要一个返回值,返回值写入到HTML流:
@Html.YourHelper()
Web表单语法:
<%: Html.YourHelper() %>
同样,如果结果值= IHtmlString:
<%= Server.HtmlEncode(Html.YourHelper()) %>
其他提示
附录:
您可以得到相同或相似,误差@ Html.RenderPartial。在这种情况下,它是由于直接的RenderPartial呈现到响应的事实,所以不是字符串和需求的“剃刀代码块”内将被编码:
@{
Html.RenderPartial(...);
}
我怀疑是的,微软已经包含在ASP.NET MVC新Html.Partial的原因之一。作为Html.Partial确实返回一个字符串,它是确定写:
@Html.Partial
这看起来好了很多。鉴于剃刀申报的目标之一是要容易对眼睛,这是很可能如此。
这也一种品牌的我,至少,手感更舒适。我知道什么是返回一个字符串,我做这一切的时候。但是,“返回响应”需要一些更多的脑循环每次想起它的时候。
和它与古老的格言适合终于Microsoft获取合适自己的产品版本3. EG,访问97
这是一个按压比喻。产地来源证他们搞砸的事情了4个版本,即,访问2000 ...
您的HTML帮助应该返回MvcHtmlString它代表了HTML为了工作,剃刀(以及其他视图引擎不属于WebFormsViewEngine)正确
public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
return MvcHtmlString.Create("<label>" + expression + "</label>");
}