剃刀:声明性HTML助手

时间:2010-12-15 15:00:04

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

我正在尝试编写一个简单的声明性html帮助器:

@helper Echo(string input) {
    @input
}

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

我做错了什么?

7 个答案:

答案 0 :(得分:48)

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

将您的帮助程序放在App_Code中但有一些限制会影响某些MVC方案(例如:无法访问标准MVC Html.帮助程序)

答案 1 :(得分:35)

简单的解决方法:

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

答案 2 :(得分:9)

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

我们正在为声明性HTML帮助程序开发更好的解决方案,但它不会生成v1。对于v1,我们有两个解决方案:

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

答案 3 :(得分:6)

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

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

按照步骤进行操作。密钥似乎既是App_Code文件夹,也是调用帮助程序时使用文件名点帮助程序名称。

答案 4 :(得分:6)

在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 :(得分:4)

我知道这是游戏的后期......但是,将当前的View传递给帮助函数。从视图中您可以访问Html和帮助函数。

答案 6 :(得分:2)

另一个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; } }
}