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

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

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

6 ответов

Решение

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

  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!
}

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

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

Компиляция и рендеринг шаблона так же просты, как две строки кода:

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

Обе 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);

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

Был май 2022 года, и я поцеловал несколько лягушек, прежде чем нашел этот блог: https://soundaranbu.medium.com/render-razor-view-cshtml-to-string-in-net-core-7d125f32c79 .

ОЧЕНЬ прост в использовании вместе с .Net Core Razor Class Library (RCL) и этой небольшой библиотекой: RazorTemplating

      using Razor.Templating.Core;

var model = new ExampleModel()
{
    PlainText = "This text is rendered from Razor Views using Razor.Templating.Core",
    HtmlContent = "<em>You can use it to generate email content, report generation and so on</em>"
};

// Both ViewBag and ViewData should be added to the same dictionary. 
var viewDataOrViewBag = new Dictionary<string, object>();
// ViewData is same as mvc
viewDataOrViewBag["Value1"] = "1";

// ViewBag.Value2 can be written as below. There's no change on how it's accessed in .cshtml file
viewDataOrViewBag["Value2"] = "2";

var html = await RazorTemplateEngine.RenderAsync("/Views/ExampleView.cshtml", model, viewDataOrViewBag);
Другие вопросы по тегам