Бритва: декларативные HTML-помощники
Я пытаюсь написать простой декларативный html-помощник:
@helper Echo(string input) {
@input
}
Помощник отлично работает, если я вставляю его в страницу, на которой я хочу ее использовать. Но если я переместил его в отдельный файл .cshtml
и поместил его в каталог ~/Views/Helpers
, мое представление больше не может быть скомпилировано, потому что помощник не найден. Согласно статье Scott Gu в блоге о Razor, она должна работать.
Что я делаю неправильно?
Ответы
Ответ 1
Местоположение ~/Views/Helpers
, описанное в этом сообщении ScottGu, не будет работать в RTM MVC 3. В то время, когда эта статья была написана, это была дизайнерская идея, которую мы бросали, но в конечном итоге мы не смогли ее реализовать.
Помещение ваших помощников в App_Code работает, но имеет определенные ограничения, которые влияют на некоторые сценарии MVC (например: нет доступа к стандартным помощникам MVC Html.
)
Ответ 2
Простой способ:
В каждом помощнике добавьте аргумент страницы WebViewPage.
App_Code\Test.cshtml:
@using System.Web.Mvc.Html
@using System.Web.Mvc
@helper HelloWorld(WebViewPage page)
{
@page.Html.Label("HelloWorld")
}
Использование этого помощника на любой странице:
@Test.HelloWorld(this)
Ответ 3
Как сказал marcind, мы не смогли поддерживать расположение ~/Views/Helpers
из-за некоторых ограничений в нашей модели компиляции.
Мы работаем над лучшим решением для декларативных помощников HTML, но это не сделает v1. Для v1 имеем два решения:
Ответ 4
Я выполнил шаги, перечисленные в блоге Скотта, и не смог заставить его работать.
Я искал и нашел эту ссылку: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper-method
Последующие шаги и работа. Ключ, как представляется, является как папкой App_Code, так и именем имени хелпера имени имени файла при вызове помощника.
Ответ 5
В App_Code @helper нуждается в правильной работе:
// 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...
}
Ответ 6
Я знаю, что это уже поздно в игре... Но перейдите в текущий вид к вспомогательной функции. Из представления вы имеете доступ к Html и вспомогательным функциям.
Ответ 7
Еще один ответ на ответ CodeAngry, это позволяет помощникам для каждого метода в файле.
@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Razor;
@functions {
private static WebViewPage page { get { return PageContext.Page as WebViewPage; } }
private static System.Web.Mvc.HtmlHelper Html { get { return page.Html; } }
private static UrlHelper Url { get { return page.Url; } }
private static dynamic ViewBag { get { return page.ViewBag; } }
}