2010-09-02 3 views
94

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

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

ответ

70

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

  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 о ваших намерениях.

Так, например, в то время как это верно Бритва код (из-за <div> тега):

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

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

@if(printHello) { 
    Hello! 
} 

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

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

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

@if(printHello) { 
    @:Hello! 
} 
+2

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

+6

@Thomas Razor должен отлично справляться с этими сценариями, вам просто нужно добавить те волшебные теги '' или использовать '@:' время от времени. Как только поддержка редактора VS выйдет для синтаксиса Razor, будет довольно легко сказать, когда произойдут переходы. – marcind

3

Введите код или текст: вы имеете в виду как T4 Шаблоны: http://msdn.microsoft.com/en-us/library/bb126445.aspx или toolsmith tools?

+0

Это нуждается upvotes потому что T4 имеет сходство с Razor и является фактическим универсальным генератором кода, который поставляется из коробки как функция в Visual Studio - по существу, это универсальная «Razor». –

+0

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

+0

Ну, возможно, до тех пор, пока все, что он генерирует, можно интерпретировать, как CSHTML может быть движком Razor во время выполнения. Вы также можете программировать его сгенерировать код, но скомпилированный код должен быть проанализирован компилятором для использования. –

32

Проверить RazorEngine, это немного рамки построен на вершине Бритвы, что позволяет сделать это.

+0

Если у вас возникли проблемы с установкой этого проекта в приложении .net 4 для таргетинга, вам нужны обновления. –

+0

Не работает атм. Я ищу другой вариант. –

18

Посмотрите на RazorTemplates библиотеки. Он более легкий, чем библиотека RazorEngine, он потокобезопасен и имеет очень хороший минимальный интерфейс.

Составление и предоставление шаблон так же просто, как две строки кода:

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

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

+1

Этот проект не был обновлен в течение длительного времени. –

7

Оба 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); 
Смежные вопросы