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ć.
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.
)
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)
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:
- App_Code (który ma pewne problemy, jak wspomniał Marcin, ale działa)
- David Ebbo (członek zespołu) ma dodatek Visual Studio, który kompiluje je do biblioteki DLL
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.
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...
}
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.
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; } }
}
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