Razor: Declarative HTML helpers

2019-01-04 10:35发布

I'm trying to write a simple declarative html helper:

@helper Echo(string input) {
    @input
}

The helper works fine if I embed it into the page I want to use it on. But if I move it to a separate .cshtml file and place that file in the ~/Views/Helpers directory, my view can't be compiled anymore because the helper is not found. According to Scott Gu's blog article on Razor it should work.

What am I doing wrong?

7条回答
可以哭但决不认输i
2楼-- · 2019-01-04 11:04

In App_Code a @helper needs this to work properly:

// 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...
}
查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-01-04 11:07

I know this is late in the game... But, pass in the current View to the helper function. From the view you have access to Html and the helper functions.

查看更多
三岁会撩人
4楼-- · 2019-01-04 11:10

The ~/Views/Helpers location as describe in that ScottGu post will not work in MVC 3 RTM. At the time that article was written it was a design idea we were tossing around but ultimately we were not able to implement it.

Putting your helpers in App_Code works but has certain limitations that impact certain MVC scenarios (for example: no access to standard MVC Html. helpers)

查看更多
孤傲高冷的网名
5楼-- · 2019-01-04 11:13

I followed the steps listed in Scott's blog as well and wasn't able to get it working either.

I did some searching and found this link: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper-method

Followed the steps and it's working. The key seems to be both the App_Code folder as well as using the file name dot helper name when calling the helper.

查看更多
Fickle 薄情
6楼-- · 2019-01-04 11:13

Another take on CodeAngry's answer, this enables the helpers for every method in the file.

@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; } }
}
查看更多
何必那么认真
7楼-- · 2019-01-04 11:24

Simple workaround:

In each helper add argument WebViewPage page.

App_Code\Test.cshtml:

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

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

This helper usage in any page:

 @Test.HelloWorld(this)
查看更多
登录 后发表回答