Я пытался создать декларативный помощник Razor в моей папке App_Code для проекта MVC 3 RTM.
Проблема, с которой я столкнулся, заключалась в том, что расширения MVC HtmlHelper, такие как ActionLink, недоступны. Это связано с тем, что скомпилированные помощники являются производными от System.Web.WebPages.HelperPage
, и, хотя они предоставляют Html
свойство, его тип, System.Web.WebPages.HtmlHelper
а не System.Web.Mvc.HtmlHelper
.
Пример ошибки, которую я получал:
'System.Web.Mvc.HtmlHelper' не содержит определения для 'ActionLink' и не может быть найден метод расширения 'ActionLink', принимающий первый аргумент типа 'System.Web.Mvc.HtmlHelper' (отсутствует ли у вас директива using или ссылка на сборку?)
Моим единственным решением было создать свой собственный HelperPage и переопределить свойство Html:
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; }
}
}
Затем я должен написать следующее в верхней части каждого помощника:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Это должно быть так сложно в MVC 3, или я что-то делаю не так?