是否可以在asp.net之外使用Razor View Engine

ycggw6v2  于 5个月前  发布在  .NET
关注(0)|答案(7)|浏览(60)

如果我看看剃刀视图引擎,然后我看到一个非常漂亮和简洁的语法,不是特别绑定到生成html。所以我想知道,如何容易使用引擎以外的asp.net在一个“正常”.net环境中,例如生成文本,代码,.
任何指针,例子,评论或解释是受欢迎的。

6za6bjd0

6za6bjd01#

2023年12月更新:

ASP.NET Core 8.0开始,现在可以使用Microsoft.AspNetCore.Components.Web.HtmlRenderer
RenderMessage.razor

<h1>Render Message</h1>

<p>@Message</p>

@code {
    [Parameter]
    public string Message { get; set; }
}

字符串
app.cs

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ConsoleApp1;

IServiceCollection services = new ServiceCollection();
services.AddLogging();

IServiceProvider serviceProvider = services.BuildServiceProvider();
ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();

await using var htmlRenderer = new HtmlRenderer(serviceProvider, loggerFactory);

var html = await htmlRenderer.Dispatcher.InvokeAsync(async () =>
{
    var dictionary = new Dictionary<string, object?>
    {
        { "Message", "Hello from the Render Message component!" }
    };

    var parameters = ParameterView.FromDictionary(dictionary);
    var output = await htmlRenderer.RenderComponentAsync<RenderMessage>(parameters);

    return output.ToHtmlString();
});

Console.WriteLine(html);

lskq00tm

lskq00tm2#

这里有两个问题:
1.是的,您可以在ASP.NET应用程序域的上下文之外运行Razor视图引擎,正如Andrew的博客http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of-aspnet-revised-for-mvc3-rc.html中所解释的那样
1.然而,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!
}

j7dteeu8

j7dteeu83#

检查RazorEngine,这是一个建立在Razor之上的小框架,允许你这样做。

lp0sw83n

lp0sw83n4#

看看RazorTemplates库,它比RazorEngine库更轻量级,它是线程安全的,并且有非常好的最小化接口。
编译和呈现模板就像两行代码一样简单:

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

字符串

8i9zcol2

8i9zcol25#

这里已经提到了RazorEngineRazorTemplates,但请查看RazorMachine。您可以简单地将非MVC应用指向(另一个)现有MVC应用的~/Views文件夹,执行并发送适当的模型,并在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);

字符串

dm7nw8vv

dm7nw8vv6#

生成代码或文本:你的意思是像T4模板:http://msdn.microsoft.com/en-us/library/bb126445.aspx或codesmith工具?

2o7dmzc5

2o7dmzc57#

2022年5月,在找到这个博客之前,我吻了几只青蛙: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);

字符串

相关问题