Бритва: декларативные помощники HTML - PullRequest
48 голосов
/ 15 декабря 2010

Я пытаюсь написать простой декларативный помощник html:

@helper Echo(string input) {
    @input
}

Помощник работает нормально, если я встраиваю его на страницу, на которой хочу использовать.Но если я переместу его в отдельный файл .cshtml и поместу этот файл в каталог ~/Views/Helpers, мое представление больше не будет скомпилировано, потому что помощник не найден.Согласно статье Скотта Гу в блоге о Razor , она должна работать.

Что я делаю не так?

Ответы [ 7 ]

49 голосов
/ 15 декабря 2010

Местоположение ~/Views/Helpers, как описано в этом сообщении ScottGu, не будет работать в MVC 3 RTM.На момент написания статьи это была идея дизайна, которую мы обсуждали, но в конечном итоге мы не смогли ее реализовать.

Включение ваших помощников в App_Code работает, но имеет определенные ограничения, которые влияют на определенные сценарии MVC (например,: нет доступа к стандартным помощникам MVC Html.)

36 голосов
/ 18 ноября 2011

Простой обходной путь:

В каждом помощнике добавьте аргумент страницы 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)
9 голосов
/ 15 декабря 2010

Как сказал Марсинд , мы не смогли поддержать местоположение ~/Views/Helpers из-за некоторых ограничений в нашей модели компиляции.

Мы работаем над лучшим решением для декларативногоПомощники HTML, но это не сделает v1.Для v1 у нас есть два решения:

  1. App_Code (который имеет некоторые проблемы, о которых говорил Марцин, но работает)
  2. Дэвид Эббо (член команды) имеет aНадстройка Visual Studio, которая компилирует их в вашу DLL
7 голосов
/ 19 июля 2015

В 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 голосов
/ 15 декабря 2010

Я также выполнил шаги, перечисленные в блоге Скотта, но так и не смог заставить его работать.

Я провел поиск и нашел эту ссылку: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper-method

Последовал за шагами, и это работает. Кажется, что ключом является как папка App_Code, так и имя точечного имени помощника при вызове помощника.

4 голосов
/ 21 января 2014

Я знаю, что это поздно в игре ... Но, передайте текущий просмотр вспомогательной функции. В представлении у вас есть доступ к Html и вспомогательным функциям.

3 голосов
/ 08 февраля 2016

Еще один ответ на Ответ 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; } }
}
...