Razor: deklaratywne helpery HTML

Próbuję napisać prosty deklaratywny helper html:

@helper Echo(string input) {
    @input
}

Helper działa dobrze, jeśli osadzę go na stronie, na której chcę go użyć. Ale jeśli przeniosę go do oddzielnego pliku .cshtml i umieszczę go w katalogu ~/Views/Helpers, Mój widok nie może być już skompilowany, ponieważ helper nie został znaleziony. Według Scotta Gu ' s blog artykuł na Razor to powinno zadziałać.

Co robię źle?
Author: Chi, 2010-12-15

7 answers

Lokalizacja ~/Views/Helpers opisana w tym poście ScottGu nie będzie działać w MVC 3 RTM. W momencie pisania tego artykułu był to pomysł projektowy, który rzucaliśmy, ale ostatecznie nie byliśmy w stanie go wdrożyć.

Umieszczanie helperów w App_Code działa, ale ma pewne ograniczenia, które wpływają na określone scenariusze MVC (na przykład: brak dostępu do standardowych helperów MVC Html.)

 48
Author: marcind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 18:45:58

Proste obejście:

W każdym helperze dodaj argument strona WebViewPage.

App_Code \ Test.cshtml:

@using System.Web.Mvc.Html
@using System.Web.Mvc

@helper HelloWorld(WebViewPage page)
{
    @page.Html.Label("HelloWorld")
}

Użycie helpera na dowolnej stronie:

 @Test.HelloWorld(this)
 35
Author: Serj-Tm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 12:33:31

Jak powiedział marcind , nie byliśmy w stanie obsługiwać lokalizacji ~/Views/Helpers z powodu pewnych ograniczeń w naszym modelu kompilacji.

Pracujemy nad lepszym rozwiązaniem dla deklaratywnych helperów HTML, ale nie stworzy v1. Dla v1 mamy dwa rozwiązania:

  1. App_Code (który ma pewne problemy, jak wspomniał Marcin, ale działa)
  2. David Ebbo (członek zespołu) ma dodatek Visual Studio, który kompiluje je do biblioteki DLL
 9
Author: Andrew Stanton-Nurse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:02

Postępowałem zgodnie z krokami wymienionymi na blogu Scotta i też nie byłem w stanie go uruchomić.

Poszukałem i znalazłem ten link: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper-method

Wykonałem kroki i działa. Kluczem wydaje się być zarówno folder App_Code, jak i użycie nazwy pliku dot Helper name podczas wywoływania helpera.

 6
Author: Brian Ball,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 15:45:31

W App_Code @ helper musi to działać poprawnie:

// 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
Author: CodeAngry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-19 18:53:25

Wiem, że jest późno w grze... Ale, przekazać w bieżącym widoku do funkcji pomocniczej. Z widoku masz dostęp do Html i funkcji pomocniczych.

 4
Author: Jim Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 15:52:58

Kolejne spojrzenie na Kodeangry ' s answer , to umożliwia helpery dla każdej metody w pliku.

@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; } }
}
 2
Author: rbuddicom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:09