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?