首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Razor : ASP.NET中的自定义Helpers

Razor : ASP.NET中的自定义Helpers
EN

Stack Overflow用户
提问于 2010-11-18 23:52:08
回答 3查看 44.4K关注 0票数 63

我在使用Razor时遇到了Html帮助器的问题。上述帮助器在MVC2的web表单视图引擎中工作得很好。但不是在剃刀里。我在运行时得到的错误是:

代码语言:javascript
复制
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输出将显示:

代码语言:javascript
复制
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(...))带红色下划线,并显示以下消息:

代码语言:javascript
复制
Cannot implicitly convert type 'void' to 'object'

IncrementalMenu位于Wingspan.Web.Mvc命名空间中。它的签名如下:

代码语言:javascript
复制
public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
    // Uses an HtmlTextWriter to render a menu from the sitemap
}

如果我知道哪里出了问题,我就大吃一惊。

PS:

MenuBlock参数只是标识菜单应该如何呈现的枚举。不要纠结于此,因为这是很好的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-19 00:09:25

你可以这样调用你的助手:

代码语言:javascript
复制
@{ Html.IncrementalMenu(MenuBlock.Site); }

WebForms语法

代码语言:javascript
复制
<% Html.IncrementalMenu(MenuBlock.Site); %>

您只需调用您的方法,并且忽略返回值(如果有)。

这样的代码需要一个返回值,并将返回值写入html流:

代码语言:javascript
复制
@Html.YourHelper()

Webforms语法:

代码语言:javascript
复制
<%: Html.YourHelper() %>

同样,如果结果值!= IHtmlString:

代码语言:javascript
复制
<%= Server.HtmlEncode(Html.YourHelper()) %>
票数 85
EN

Stack Overflow用户

发布于 2011-02-10 03:00:51

附录:

对于@Html.RenderPartial,您可能会得到相同或类似的错误。在这种情况下,这是因为RenderPartial直接呈现给响应,所以不是字符串,需要在"Razor代码块“中进行编码:

代码语言:javascript
复制
@{
   Html.RenderPartial(...);
}

我怀疑这是微软在ASP.NET MVC中包含新的Html.Partial的原因之一。由于Html.Partial确实返回字符串,因此可以这样写:

代码语言:javascript
复制
@Html.Partial

看起来好多了。鉴于Razor宣布的目标之一是让人看起来很舒服,这很可能是真的。

至少,这也让我感觉更舒服。我知道返回字符串是什么意思,我经常这样做。但是,每次我想的时候,“返回到反应”都需要更多的大脑周期。

这与一句古老的格言相吻合,即微软最终在版本3中获得了正确的产品。例如,Access 97。

这是一个令人沮丧的比喻。因为他们搞砸了版本4,也就是Access 2000...

票数 49
EN

Stack Overflow用户

发布于 2010-11-18 23:56:30

您的HTML helper应该返回代表html的MvcHtmlString,以便与Razor (和其他非WebFormsViewEngine的视图引擎)一起正常工作。

代码语言:javascript
复制
public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4216736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档