无法让 RazorEngine 与 asp core DI 容器一起使用

问题描述 投票:0回答:1

我希望获得一个与 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

有什么想法吗?

c# asp.net-core razorengine
1个回答
0
投票

我建议使用 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);

就像魅力一样!!

© www.soinside.com 2019 - 2024. All rights reserved.