Можно ли использовать Razor View Engine за пределами asp.net


102

Если я посмотрю на Razor View Engine, то вижу очень красивый и лаконичный синтаксис, который не особенно привязан к генерации html. Поэтому мне интересно, насколько легко было бы использовать движок вне asp.net в "нормальной" среде .net, например, для генерации текста, кода, ...

Любой указатель, пример, комментарий или пояснение приветствуются.

Ответы:


80

Здесь есть две проблемы:

  1. Да, вы можете запускать Razor View Engine вне контекста домена приложения ASP.NET, как описано в блоге Эндрю: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-revised-for-mvc3-rc.html
  2. Однако Razor по-прежнему в первую очередь ориентирован на создание разметки, подобной XML (например, HTML), в том смысле, что синтаксический анализатор Razor использует присутствие <tags>для определения перехода между кодом и разметкой. Вы, вероятно, можете использовать его для генерации любого текста, но вы можете столкнуться с проблемами, если ваш вывод не соответствует предположениям Razor о ваших намерениях.

Так, например, пока это действительный код Razor (из-за <div>тега):

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

Следующий фрагмент недействителен (потому что Hello! По-прежнему обрабатывается как код):

@if(printHello) {
   Hello!
}

Однако есть специальный <text>тег, который можно использовать для принудительного перехода для многострочных блоков ( <text>тег не будет отображаться):

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

Существует также более короткий синтаксис для принудительного перехода одной строки с использованием @::

@if(printHello) {
   @:Hello!
}

2
Я думал об использовании его для генерации таких вещей, как электронная почта или генерация кода IronPython на лету. Поскольку они не используют теги, вероятно, лучше поискать другие альтернативы. Спасибо за ответ.
Thomas

6
@Thomas Razor прекрасно подойдет в этих сценариях, вам просто нужно будет добавить эти волшебные <text>теги или использовать @:время от времени. Как только появится поддержка редактора VS для синтаксиса Razor, будет довольно легко определить, когда происходят переходы.
Марсинд 03

34

Проверьте RazorEngine , это небольшой фреймворк, созданный поверх Razor, который позволяет вам это делать.


Возникли проблемы с установкой этого проекта в целевом приложении .net 4, требуются обновления.
Johnny_D

22

Взгляните на библиотеку RazorTemplates . Она более легкая, чем библиотека RazorEngine, ориентирована на многопоточность и имеет очень приятный минималистичный интерфейс.

Компиляция и рендеринг шаблона - это просто две строчки кода:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));

1
Вы подчеркиваете безопасность потоков RazorTemplates b / c, одно из других предлагаемых решений для этого вопроса нет? Меня интересует именно RazorEngine.
Стив Шеффлер,

9

И RazorEngine, и RazorTemplates уже упоминались здесь, но посмотрите RazorMachine . Вы можете просто указать свое приложение, отличное от MVC, в папку ~ / Views (другого) существующего приложения MVC, выполнить с отправкой правильной модели и получить визуализированный вывод в 2 строках кода:

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);

3

Сгенерировать код или текст: вы имеете в виду шаблоны T4: http://msdn.microsoft.com/en-us/library/bb126445.aspx или инструменты Codemith?


Для этого нужны положительные голоса, потому что T4 имеет сходство с Razor и является фактическим универсальным генератором кода, который поставляется из коробки как функция в Visual Studio - по сути, это универсальная Razor
Дэн Линг

Насколько я понимаю, шаблоны T4 могут быть изменены только во время компиляции, файл .tt преобразуется в файл .cs и сохраняется в нем. В моем случае полутехнический пользователь хотел бы обновить шаблон без необходимости перестраивать приложение. Есть ли простой способ добиться этого с помощью шаблонов T4?
Давеб

Вполне возможно, если все, что он генерирует, может быть интерпретировано, как CSHTML, может быть интерпретирован движком Razor во время выполнения. Вы также можете программно запустить его для генерации кода, но скомпилированный код должен быть проанализирован компилятором, чтобы его можно было использовать ...
Брайан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.