我希望获得一个与 RazorEngine 一起使用的 IViewLocalizer。我尝试遵循指南和一些关于 SO 的问题。
到目前为止我已经:
//Razor engine config in Startup.cs
var config = new FluentTemplateServiceConfiguration(c =>
{
c.WithBaseTemplateType(typeof(MvcTemplateBase<>));
c.ActivateUsing((ctx) =>
(ITemplate)services.BuildServiceProvider().GetRequiredService(ctx.TemplateType)
);
});
var razorEngine = RazorEngineService.Create(config);
services.AddSingleton(razorEngine);
我知道我的 ILocalizer 已正确注册为服务,我可以在 RazorEngine 之外使用它,没有问题。
我的
TemplateBase<T>
实现是:
public abstract class MvcTemplateBase<T> : TemplateBase<T>
{
public MvcTemplateBase(IViewLocalizer localizer)
{
Html = new HtmlHelper();
Json = new JsonHelper();
Localizer = localizer;
}
public HtmlHelper Html { get; set; }
public JsonHelper Json { get; set; }
public IViewLocalizer Localizer { get; set; }
}
不幸的是,当我尝试生成模板时:
- 错误:(10, 19) 没有给出与所需的形式参数“localizer”相对应的参数 'MvcTemplateBase.MvcTemplateBase(IViewLocalizer)'
所以看起来
MvcTemplateBase<T>
没有通过 DI 实例化。
此外,除了上述错误之外,我还得到:
- 错误:(15, 18) 当前上下文中不存在名称“inject”
- 错误:(17, 18) 当前上下文中不存在名称“模型”
- 错误:(19, 18) 当前上下文中不存在名称“节”
- 错误:(29, 4) 当前上下文中不存在名称“ViewData”
看起来它使用的
TemplateBase<T>
没有任何您所期望的基本属性。 AFAIK RazorEngine 应该开箱即用地支持 @model
。
有什么想法吗?
我建议使用 Razor.Templated.Core 通过 RazorEngine
您需要做的就是:
添加包
dotnet add package Razor.Templating.Core
将此行添加到您的启动或program.cs文件中:
builder.Services.AddRazorTemplating();
使用示例:
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);
就像魅力一样!!