Можно ли использовать 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 во время выполнения. Вы также можете программно запустить его для генерации кода, но скомпилированный код должен быть проанализирован компилятором, чтобы его можно было использовать ...
Брайан