Я пытался создать декларативный помощник 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, или я что-то делаю не так?
источник
Ответы:
Взгляните на
Marcind
ответ на этот вопрос. То, что вы испытываете, - это ограничение размещения декларативных представлений вApp_Code
папке.источник
Я создал метод расширения для помощника WebPages, чтобы получить доступ к помощнику страницы.
источник
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
и@using System.Web.Mvc.Html
в файл помощников cshtml внутри App_CodeHtmlHelper
класс только для целей кодирования, я нашел еще более быстрый способ сделать это с помощью статического класса,Microsoft.Security.Application.Encoder
как в:Encoder.HtmlAttributeEncode(value)
У Омара есть правильный ответ, но я хотел кое-что добавить (не стесняйтесь отмечать ответ Омара как ответ).
Мы знали об этом в v1 и не смогли получить отличное исправление в продукте, но Дэвид Эббо (архитектор в команде ASP.Net) опубликовал образец генератора кода Visual Studio, который, по сути, является первым исследованием идеи, которые мы рассматриваем, чтобы эта работа работала должным образом: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx
Попробуйте и посмотрите, что вы думаете! Сообщите Дэвиду, если у вас есть комментарии, разместив их в его блоге.
источник
Подобно ответу @Jakes:
Использование:
Источник: Дино Эспозито - Программирование Microsoft ASP.NET MVC
источник
Альтернативное решение:
Добавьте это поверх своего файла-помощника по бритве:
затем назовите это так:
источник
Мой подход к этому - просто передать страницу в качестве параметра вспомогательному методу. Итак, в вашем примере это будет:
Затем в вашем представлении Razor, где вам это нужно, назовите его так:
Это немедленно дает вам доступ к свойствам страницы, подобным
Html
илиUrl
которые у вас обычно есть (и через них кHtmlHelper
расширениям).В качестве дополнительного преимущества (если вам это нужно) вы также получаете доступ к свойствам экземпляра, таким как page
ViewData
.источник
Для удобства поисковиков я получил ту же ошибку при создании представлений MVC как части библиотеки классов (для повторного использования компонентов). Решение, частично упомянутое выше, заключалось в том, чтобы добавить следующие операторы using вверху файла .cshtml:
Никаких дополнительных действий не требуется.
источник
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
при зависании@using System.Web.Mvc
. Любые идеи?Я знаю, что с MVC 3 возникают некоторые проблемы с intellisense. Я думаю, что помощники по-прежнему будут работать, если у вас есть пространство имен, установленное в web.config.
Только что был выпущен MVC 3 RTM. Вы используете эту или бета-версию?
источник
Похоже, ASP.NET MVC устранил эту проблему в VS 2013. См. Этот пост http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- HtmlHelper-ХТ
источник
@using System.Web.Mvc.Html
вверху файла cshtml в App_Code, но запись @Html .... не раскрывает ни одного из методов расширения, таких какEditorFor
. Смешно, что это не работает после двух основных выпусков и сообщений в блогах, в которых утверждается, что это было реализовано. Это не. Фактически, методы расширения не могут работать, поскольку они нацелены на класс System.Web.Mvc.HtmlHelper, а не на класс System.Web.WebPages.HtmlHelper, который предоставляется классом System.Web.WebPages.HelperPage.