Czy można używać Razor View Engine poza asp.net

102

Jeśli spojrzę na silnik widoku Razor, to widzę bardzo ładną i zwięzłą składnię, która nie jest szczególnie związana z generowaniem html. Zastanawiam się więc, jak łatwo byłoby używać silnika poza asp.net w „normalnym” środowisku .net, na przykład do generowania tekstu, kodu, ...

Wszelkie wskazówki, przykłady, komentarze lub wyjaśnienia są mile widziane.

Tomasz
źródło

Odpowiedzi:

80

Są tu dwa problemy:

  1. Tak, możesz uruchomić Razor View Engine poza kontekstem domeny aplikacji ASP.NET, jak wyjaśniono w blogu Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-revised-for-mvc3-rc.html
  2. Jednak Razor nadal koncentruje się głównie na generowaniu znaczników podobnych do XML (np. HTML) w tym sensie, że parser Razor używa obecności <tags>do określenia przejścia między kodem a znacznikami. Prawdopodobnie możesz go użyć do wygenerowania dowolnego tekstu, ale możesz napotkać problemy, gdy dane wyjściowe nie będą zgodne z założeniami Razora dotyczącymi Twoich zamiarów.

Na przykład, gdy jest to prawidłowy kod Razor (z powodu <div>tagu):

@if(printHello) {
   <div>Hello!</div>
}

Poniższy fragment jest nieprawidłowy (ponieważ Hello! Jest nadal traktowany jako kod):

@if(printHello) {
   Hello!
}

Istnieje jednak specjalny <text>tag, którego można użyć do wymuszenia przejścia dla bloków wieloliniowych ( <text>tag nie będzie renderowany):

@if(printHello) {
   <text>Hello!
   Another line</text>
}

Istnieje również krótsza składnia, która wymusza przejście jednej linii za pomocą @::

@if(printHello) {
   @:Hello!
}
marcind
źródło
2
Cóż, myślałem o użyciu go do generowania takich rzeczy, jak e-maile lub generowanie kodu IronPython w locie. Ponieważ nie używają one tagów, prawdopodobnie lepiej przyjrzeć się innym alternatywom. Dziękuję za odpowiedź.
Thomas,
6
@Thomas Razor powinien dobrze sobie radzić w tych scenariuszach, będziesz musiał po prostu dodać te magiczne <text>tagi lub używać ich @:od czasu do czasu. Gdy pojawi się obsługa edytora VS dla składni Razor, łatwo będzie stwierdzić, kiedy nastąpią przejścia.
marcind
34

Sprawdź RazorEngine , to mała struktura zbudowana na bazie Razor, która pozwala ci to zrobić.

Ariel
źródło
Miałem problemy z instalacją tego projektu w aplikacji docelowej .net 4, wymaga aktualizacji.
Johnny_D
22

Spójrz na bibliotekę RazorTemplates . Jest lżejsza niż biblioteka RazorEngine, jest bezpieczna dla wątków i ma bardzo ładny minimalny interfejs.

Kompilowanie i renderowanie szablonu jest tak proste, jak dwa wiersze kodu:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));
Alexey
źródło
1
Czy podkreślasz bezpieczeństwo wątków RazorTemplates b / c jedno z innych sugerowanych rozwiązań tego pytania nie jest? Szczególnie interesuje mnie RazorEngine.
Steve Scheffler
9

Zarówno RazorEngine, jak i RazorTemplates są już tutaj wspomniane, ale sprawdź RazorMachine . Możesz po prostu skierować swoją aplikację inną niż MVC do folderu ~ / Views (innej) istniejącej aplikacji MVC, wykonać z wysłaniem odpowiedniego modelu i uzyskać wyrenderowane dane wyjściowe w 2 wierszach kodu:

var sb = new StringBuilder();

//RazorMachine magic:
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style
var rm = new RazorMachine(htmlEncode: false);
ITemplate template = rm.ExecuteUrl("~/twitter/twitter", tweets);

//do whatever you want with result
sb.Append(template);
Antonin Jelinek
źródło
3

Wygeneruj kod lub tekst: masz na myśli szablony T4: http://msdn.microsoft.com/en-us/library/bb126445.aspx czy narzędzia codmith?

Brian Mains
źródło
To wymaga głosów pozytywnych, ponieważ T4 ma podobieństwa do Razor i jest rzeczywistym generatorem kodu uniwersalnego, który jest dostarczany po wyjęciu z pudełka jako funkcja w programie Visual Studio - w zasadzie jest to uniwersalny `` Razor ''
Dan Ling
Rozumiem, że szablony T4 można zmienić tylko w czasie kompilacji, plik .tt jest konwertowany i zapisywany jako plik .cs. W moim przypadku użytkownik pół-techniczny chciałby zaktualizować szablon bez konieczności przebudowywania aplikacji. Czy można to łatwo osiągnąć za pomocą szablonów T4?
daveb
Cóż, prawdopodobnie, o ile to, co generuje, może być zinterpretowane, tak jak CSHTML może być przez silnik Razor w czasie wykonywania. Możesz również programowo uruchomić go w celu wygenerowania kodu, ale skompilowany kod musi zostać przeanalizowany przez kompilator, aby był użyteczny ....
Brian Mains