Razor:声明式HTML帮助程序

我试图写一个简单的声明性的HTML帮手:

@helper Echo(string input) { @input } 

如果我将它embedded到我想要使用的页面中,该帮助程序工作正常。 但是,如果我将它移动到一个单独的.cshtml文件并将该文件放在~/Views/Helpers目录中,我的视图就不~/Views/Helpers被编译,因为找不到帮助器。 根据Scott Gu的博客文章Razor,它应该工作。

我究竟做错了什么?

~/Views/Helpers中描述的~/Views/Helpers位置在MVC 3 RTM中不起作用。 在写文章的时候,这是一个devise理念,我们正在折腾,但最终我们无法实现它。

把你的帮手放到App_Code里面,但是有一些限制,影响了某些MVC场景(例如:不能访问标准的MVC Html.

简单的解决方法:

在每个帮助器中添加参数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) 

正如marcind所说 ,由于我们编译模型的某些限制,我们无法支持~/Views/Helpers位置。

我们正在为声明式HTML帮助器提供更好的解决scheme,但是它不会生成v1。 对于v1,我们有两个解决scheme:

  1. App_Code(这有一些问题,如Marcin提到的,但确实有效)
  2. David Ebbo(团队成员)有一个Visual Studio加载项,将它们编译到您的DLL中

我遵循斯科特博客中列出的步骤,也无法得到它的工作。

我做了一些search,发现这个链接: http : //dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper -方法

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

在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... } 

我知道这是在游戏中晚了……但是,在当前视图传递给帮助函数。 从视图中你可以访问Html和辅助函数。

另一个CodeAngry的答案 ,这使助手的文件中的每个方法。

 @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; } } }