【问题标题】:ASP.NET MVC: Custom Html Helpers in RazorASP.NET MVC:Razor 中的自定义 Html 助手
【发布时间】:2011-05-12 03:09:21
【问题描述】:

与 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 返回 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 参数只是一个枚举,用于标识菜单应如何呈现。不要执着于此,因为这很好。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

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

    @{ Html.IncrementalMenu(MenuBlock.Site); }
    

    WebForms 语法

    <% Html.IncrementalMenu(MenuBlock.Site); %>
    

    你只是调用你的方法,返回值(如果有的话)会被忽略。

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

    @Html.YourHelper()
    

    网络表单语法:

    <%: Html.YourHelper() %>
    

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

    <%= Server.HtmlEncode(Html.YourHelper()) %>
    

    【讨论】:

      【解决方案2】:

      附录:

      您可以使用@Html.RenderPartial 得到相同或相似的错误。在这种情况下,这是由于 RenderPartial 直接呈现给 Response,因此不是字符串,需要在“Razor 代码块”内编码:

      @{
         Html.RenderPartial(...);
      }
      

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

      @Html.Partial
      

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

      至少,这也让我感觉更舒服。我知道什么是返回字符串,我一直这样做。但“回归响应”每次想到都需要多几个脑循环。

      这符合古老的格言,即微软最终在版本 3 中获得了他们的产品。EG,Access 97。

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

      【讨论】:

      • 哦,我猜你刚刚救了我半个小时。谢谢。
      • RenderPartial 实际上并不直接渲染到响应;如果这样做,它会弄乱 Razor 布局,首先将页面本身渲染到缓冲区,然后用于渲染其布局,然后在其父布局上使用它,直到没有更多父布局。然后最后实际写出响应。如果 RenderPartial() 在页面中执行时呈现给响应,它将是响应中的第一件事 - 相反,它只是在缓冲输出中的该点附加一个字符串,这意味着它具有与 @Html 相同的效果.部分。
      【解决方案3】:

      您的 HTML 帮助程序应返回代表 html 的 MvcHtmlString,以便与 Razor(以及其他不是 WebFormsViewEngine 的视图引擎)一起正常工作

      public static MvcHtmlString Label(this HtmlHelper html, string expression)
      {
          return MvcHtmlString.Create("<label>" + expression + "</label>");
      }
      

      【讨论】:

      • 非常感谢,我花了很长时间才弄明白,因为我来自 ASPX 视图引擎...
      猜你喜欢
      • 2011-11-14
      • 2014-12-04
      • 2014-03-07
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多