【问题标题】:Razor: Declarative HTML helpersRazor:声明式 HTML 助手
【发布时间】:2011-05-25 23:26:12
【问题描述】:

我正在尝试编写一个简单的声明式 html 助手:

@helper Echo(string input) {
    @input
}

如果我将帮助程序嵌入到我想使用它的页面中,它就可以正常工作。但是如果我将它移动到单独的.cshtml 文件并将该文件放在~/Views/Helpers 目录中,我的视图将无法再编译,因为找不到帮助程序。根据 Scott Gu 的blog article on Razor,它应该可以工作。

我做错了什么?

【问题讨论】:

  • 我很确定帮助器尚未在单独的视图中启用。我知道它正在开发中。

标签: c# asp.net-mvc asp.net-mvc-3 razor html-helper


【解决方案1】:

ScottGu 帖子中描述的~/Views/Helpers 位置在 MVC 3 RTM 中不起作用。在撰写那篇文章时,这是一个我们在折腾的设计理念,但最终我们无法实现它。

将您的助手放入 App_Code 是可行的,但有一些限制会影响某些 MVC 场景(例如:无法访问标准 MVC Html. 助手)

【讨论】:

  • 这是否意味着声明式 HTML 助手实际上已经死了?与常规局部视图相比,优势在哪里?
  • 他们还没有死,我们正在考虑提供一些附加组件(通过 MvcFutures 或 nuget 包)来解决这些问题。但在这一点上,他们的未来是“模糊的”。
  • 更新这篇文章可能是个好主意,因为它让我觉得它在 MVC 3 版本中。谢谢
  • 对不起,没有。 MVC 4 将不包含此功能。请在aspnet.uservoice.com/forums/41201-asp-net-mvc 上发布功能请求
  • 嗨!我已经在 ASP.NET 用户语音中创建了一个与此相关的想法:Support @helper ExtensionMethod(this HtmlHelper html) for views in APP_CODE...在将它带到前线时,我们非常感谢您的帮助...谢谢!
【解决方案2】:

简单的解决方法:

在每个帮助器中添加参数 WebViewPage 页面。

App_Code\Test.cshtml:

@using System.Web.Mvc.Html
@using System.Web.Mvc

@helper HelloWorld(WebViewPage page)
{
    @page.Html.Label("HelloWorld")
}

此帮助器在任何页面中的用法:

 @Test.HelloWorld(this)

【讨论】:

  • 这似乎不起作用 - page.Html 不包含标签(或任何其他辅助方法)
  • 帮助方法标签(和其他)是扩展,在类 System.Web.Mvc.Html.LabelExtension 中声明。添加使用 System.Web.Mvc.Html
  • 在我的情况下工作得很好,我需要访问 Html.AttributeEncode 帮助程序。谢谢深灰色!
  • 谢谢,成功了!虽然我不喜欢每次都通过this 的想法,但现在可以使用,同时我找到了另一种解决方案。再次感谢!
【解决方案3】:

As marcind said,由于我们的编译模型存在一些限制,我们无法支持 ~/Views/Helpers 位置。

我们正在为声明式 HTML 帮助程序开发更好的解决方案,但它不会在 v1.1 中实现。对于 v1,我们有两种解决方案:

  1. App_Code(如 Marcin 所述,存在一些问题,但确实有效)
  2. David Ebbo(团队成员)拥有a Visual Studio add-in that compiles them into your DLL

【讨论】:

  • mvc 3 最终版现在支持吗?
  • @Recycle Bin -- 显然不是。
  • 不,我在这里用另一个帖子验证了这一点:stackoverflow.com/questions/4988135/…
  • 一个小时前我也被愚弄了,只有在同一个 cshtml 文件中声明它们时,助手才能工作。
【解决方案4】:

在 App_Code 中,@helper 需要此功能才能正常工作:

// These are important for `Html.RouteLink` and such.
@using System.Web.Mvc;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Razor;

@helper SomeHelper()
{
    // Get page and pull helper references from it.
    var wvp = PageContext.Page as System.Web.Mvc.WebViewPage;
    var Url = wvp.Url; // UrlHelper access
    var Html = wvp.Html; // HtmlHelper access
    var ViewBag = wvp.ViewBag;
    // Helper code comes here...
}

【讨论】:

    【解决方案5】:

    我也按照 Scott 博客中列出的步骤进行操作,但也无法正常工作。

    我做了一些搜索,找到了这个链接:http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper-method

    按照步骤操作,它正在工作。关键似乎是 App_Code 文件夹以及调用助手时使用文件名点助手名称。

    【讨论】:

    • 我不认为这是 Razor 助手应该工作的方式,但这是一个很好的解决方法。非常感谢!
    • 不幸的是,dotnetslackers.com 网站已不存在。如果您引用了其中的一些内容或发布了文章的标题,那么如果该文章已在其他地方发布,我可能会使用 Google 在其他地方找到该文章。 :-(
    【解决方案6】:

    我知道这已经很晚了...但是,将当前视图传递给辅助函数。从视图中,您可以访问 Html 和辅助函数。

    【讨论】:

      【解决方案7】:

      CodeAngry's answer 的另一种看法,这将为文件中的每个方法启用帮助器。

      @using System.Web.Mvc;
      @using System.Web.Mvc.Html;
      @using System.Web.Mvc.Routing;
      @using System.Web.Mvc.Razor;
      
      @functions {
          private static WebViewPage page { get { return PageContext.Page as WebViewPage; } }
          private static System.Web.Mvc.HtmlHelper Html { get { return page.Html; } }
          private static UrlHelper Url { get { return page.Url; } }
          private static dynamic ViewBag { get { return page.ViewBag; } }
      }
      

      【讨论】:

      • 这些函数在 MVC 5.x(可能更早版本)中不是必需的。看起来HelperPage 基类现在具有内置的 Page 和 Html 属性,因此例如,您可以在帮助代码中直接使用 Page.UrlPage.ViewBag
      • 你确定吗?我仍然无法在最新 mvc 的新项目中访问这些帮助程序。也许智能感知只是在告诉我谎言;)
      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多