I was trying to create a Razor declarative helper in my App_Code folder for an MVC 3 RTM project.
The problem I ran into was that the MVC HtmlHelper extensions, like ActionLink, aren't available. This is because the compiled helpers derive from System.Web.WebPages.HelperPage
, and though it exposes an Html
property, its of type System.Web.WebPages.HtmlHelper
rather than System.Web.Mvc.HtmlHelper
.
An example of the kind of error I was getting is:
'System.Web.Mvc.HtmlHelper' does not contain a definition for 'ActionLink' and no extension method 'ActionLink' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?)
My only solution has been to create my own HelperPage and override the Html property:
using System.Web.WebPages;
public class HelperPage : System.Web.WebPages.HelperPage
{
// Workaround - exposes the MVC HtmlHelper instead of the normal helper
public static new HtmlHelper Html
{
get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
}
}
I then have to write the following at the top of every helper:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Is it meant to be this hard in MVC 3, or am I doing something wrong?
For the benefit of searchers, I got the same error when creating MVC views as part of a class library (for component re-use). The solution, partially alluded to above, was to add the following using statements at the top of the .cshtml file:
No further work necessary.
Omar's got the right answer here, but I wanted to add something (do feel free to mark Omar's response as the answer).
We were aware of this in v1 and weren't able to get a great fix in the product, but David Ebbo (an architect on the ASP.Net team) posted a sample of a Visual Studio Code Generator that is basically a first exploration of the kind of ideas we're looking at to make this work properly: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx
Try that out and see what you think! Let David know if you have comments by posting on his blog.
An alternative solution:
Add this on top of your razor-helper file:
then call it like this:
Similar to @Jakes answer:
Usage:
Source: Dino Esposito - Programming Microsoft ASP.NET MVC
I know that there are some intellisense issues with MVC 3. I think the helpers will still work if you have the namespace set in web.config.
MVC 3 RTM has just been realeased are you using this or a beta?
I created an extension method for the WebPages helper so that I can get access to the page helper.