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);
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);
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);
7条答案
按热度按时间6za6bjd01#
2023年12月更新:
从ASP.NET Core 8.0开始,现在可以使用
Microsoft.AspNetCore.Components.Web.HtmlRenderer
:RenderMessage.razor
:字符串
app.cs
:型
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>
标记):字符串
下列程式码片段无效(因为Hello!仍被视为程式码):
型
但是,有一个特殊的
<text>
标记可用于强制多行块进行转换(<text>
标记将不会被渲染):型
还有一个更短的语法可以使用
@:
强制转换单行:型
j7dteeu83#
检查RazorEngine,这是一个建立在Razor之上的小框架,允许你这样做。
lp0sw83n4#
看看RazorTemplates库,它比RazorEngine库更轻量级,它是线程安全的,并且有非常好的最小化接口。
编译和呈现模板就像两行代码一样简单:
字符串
8i9zcol25#
这里已经提到了RazorEngine和RazorTemplates,但请查看RazorMachine。您可以简单地将非MVC应用指向(另一个)现有MVC应用的~/Views文件夹,执行并发送适当的模型,并在2行代码中获得渲染输出:
字符串
dm7nw8vv6#
生成代码或文本:你的意思是像T4模板:http://msdn.microsoft.com/en-us/library/bb126445.aspx或codesmith工具?
2o7dmzc57#
2022年5月,在找到这个博客之前,我吻了几只青蛙:https://soundaranbu.medium.com/render-razor-view-cshtml-to-string-in-net-core-7d125f32c79
非常容易使用沿着.Net Core Razor Class Library(RCL)和这个小库:RazorTemplating
字符串