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:
- App_Code(这有一些问题,如Marcin提到的,但确实有效)
- 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; } } }
- 我如何unit testing使用FormsAuthentication的ASP.NET MVC控制器?
- ASP.NET MVC中的Redirect和RedirectToAction有什么区别?
- 使用entity framework的最有效的自引用树的方法
- 在entity framework中更新排除属性
- MVC:在哪里放置业务逻辑?
- 我怎样才能得到ASP.NET MVC控制器中的路由名称?
- 控制器在单独的组装和路由
- 无法加载文件或程序集HRESULT:0x80131515(将控制器添加到在networking驱动器上具有程序集引用的MVC项目时)
- 如何将一个string数组发送到ASP.NET MVC控制器没有窗体?