Razor: Declarative HTML helpers
Solution 1
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)
Solution 2
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)
Solution 3
As marcind said, we weren't able to support the ~/Views/Helpers
location due to some limitations in our compilation model.
We're working on a better solution for declarative HTML helpers, but it won't make v1. For v1, we have two solutions:
- App_Code (which has some problems as Marcin mentioned, but does work)
- David Ebbo (member of the team) has a Visual Studio add-in that compiles them into your DLL
Solution 4
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...
}
Solution 5
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.
Adrian Grigore
I'm a freelancer software developer from Germany specializing in ASP.NET MVC and related technlogies. Send me a message if you are interested in hiring me for development / consulting services. My current main project is a web-based, team-oriented project time tracking software for desktop and mobile devices: LogMyTime Zeiterfassung. Adrian Grigore's Blog on Software Development
Updated on July 09, 2022Comments
-
Adrian Grigore almost 2 years
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?