c html帮助器,ASP.NET MVC:Razor中的自定义HTML帮助器

与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视图引擎...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值