Бритва: декларативные 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; } }
}