【问题标题】:Specify file provider for RazorViewEngine in ASP.NET Core 6.0在 ASP.NET Core 6.0 中为 RazorViewEngine 指定文件提供程序
【发布时间】:2023-01-09 15:45:01
【问题描述】:

我有一个 ASP.NET Core 6 MVC 应用程序项目和 WebJob(控制台应用程序)的解决方案 这两个应用程序都使用一个公共库项目,我在其中有IRazorViewToStringRenderer 服务和视图。我想在 WebApp 和 WebJob 这两个应用程序中重用此服务。我的解决方案基于这个示例https://github.com/aspnet/Entropy/blob/master/samples/Mvc.RenderViewToString/Program.cs

这是我的使用方法:

   var viewToStringEngine = ServiceProvider.GetService<IRazorViewToStringRenderer>();
   string htmlContent = await viewToStringEngine.RenderToStringAsync<MyView>("~/Views/MyView.cshtml", new MyView());

问题是 RazorViewEngineOptions 不再有指定文件提供程序的选项(在 ASP.NET Core 6 中)

    services.Configure<RazorViewEngineOptions>(options =>
    {
        options.FileProviders.Clear();
        options.FileProviders.Add(fileProvider);
    });

IRazorViewToStringRenderer 服务在从 Web 应用程序调用时工作正常,但在 WebJob 中不工作。仅当 WebJob 服务包含 IWebHostEnvironment 且 ApplicationName 作为实施 IRazorViewToStringRenderer 的项目名称时,它才有效,否则无法找到视图。

如何为 RazorViewEngine 指定文件提供程序? (github sample)

WebJob 服务配置:

private static ServiceCollection ConfigureServices()
{
    var services = new ServiceCollection();
    services.AddSingleton<IConfiguration>(Configuration);

    var applicationEnvironment = PlatformServices.Default.Application;
    services.AddSingleton(applicationEnvironment);

    services.AddSingleton<Microsoft.AspNetCore.Hosting.IWebHostEnvironment>(new WebJobHostEnvironment
    {
        ApplicationName = Assembly.GetEntryAssembly().GetName().Name,
        //ApplicationName = typeof(IRazorViewToStringRenderer).Assembly.GetName().Name,
    });

    var listener = new DiagnosticListener("Microsoft.AspNetCore");
    services.AddSingleton<DiagnosticListener>(listener);
    services.AddSingleton<DiagnosticSource>(listener);
    services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
    services.AddSingleton<ILoggerFactory, LoggerFactory>(sp => new LoggerFactory());

    services.AddMvcCore().AddRazorViewEngine();

    services.AddCommonRazorEngine(Configuration);

    return services;
}

RazorServiceCollectionExtension.cs

public static class RazorServiceCollectionExtension
{
    public static void AddCommonRazorEngine(this IServiceCollection services, IConfiguration configuration)
    {
        //var fileProvider = new EmbeddedFileProvider(typeof(RazorViewToStringRenderer).Assembly);

        // FileProviders property is not available anymore           
        services.Configure<RazorViewEngineOptions>(options =>
        {
            //options.FileProviders.Add(fileProvider);
        });

        services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
    }
}

【问题讨论】:

    标签: razor asp.net-core-6.0


    【解决方案1】:

    我自己也遇到过这个问题,看来该功能已移至外部包中。我能够按照此处的说明解决此问题,然后根据我的目的对其进行修改:

    https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-6.0&tabs=visual-studio

    IE。安装包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

    然后您可以使用代码更改适当的文件提供程序:

    services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
    {
        options.FileProviders.Clear();
        options.FileProviders.Add(fileProvider);
    });
    

    【讨论】:

    • 请注意,它确实警告“Blazor 应用程序的 Razor 组件不支持运行时编译”
    • 谢谢!安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 后,它终于在我的解决方案中起作用了。另一个缺失的部分是将构建操作设置为 *.cshtml 文件的嵌入式资源。
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多