Razor:声明性HTML帮助器
我正在尝试编写一个简单的声明性html助手:
@helper Echo(string input) {
@input
}
如果将帮助器嵌入到要使用的页面中,它会很好地工作。 但是,如果我将其移到单独的2752128223533533335552文件中并将该文件放置在2752128223533335335553目录中,则由于无法找到帮助程序,因此无法再编译我的视图。 根据Scott Gu的有关Razor的博客文章,它应该可以工作。
我究竟做错了什么?
7个解决方案
49 votes
该ScottGu帖子中描述的2752128599141141647360位置在MVC 3 RTM中不起作用。 在撰写本文时,这是一个我们要抛弃的设计思想,但最终我们无法实现它。
将您的助手放入App_Code可以工作,但是有一些限制会影响某些MVC方案(例如:无法访问标准MVC Html.助手)
marcind answered 2020-02-17T22:09:17Z
36 votes
简单的解决方法:
在每个助手中添加参数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)
Serj-Tm answered 2020-02-17T22:09:50Z
9 votes
正如marcind所说,由于我们的编译模型存在某些限制,我们无法支持~/Views/Helpers的位置。
我们正在为声明性HTML助手开发一个更好的解决方案,但不会实现v1。 对于v1,我们有两种解决方案:
App_Code(如Marcin所述,存在一些问题,但确实可以工作)
David Ebbo(团队成员)有一个Visual Studio加载项,可以将它们编译到您的DLL中
Andrew Stanton-Nurse answered 2020-02-17T22:10:23Z
7 votes
在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...
}
CodeAngry answered 2020-02-17T22:10:43Z
6 votes
我也遵循Scott博客中列出的步骤,也无法使其正常运行。
我进行了一些搜索,找到了以下链接:[http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom- 辅助方法]
遵循了步骤,它正在工作。 关键似乎是App_Code文件夹,以及调用帮助程序时使用文件名点帮助程序名称。
Brian Ball answered 2020-02-17T22:11:13Z
4 votes
我知道这已经晚了……但是,将当前的View传递给helper函数。 从视图中,您可以访问HTML和帮助器功能。
Jim Shaw answered 2020-02-17T22:11:33Z
3 votes
对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; } }
}
Ryan Buddicom answered 2020-02-17T22:11:53Z