【问题标题】:Generate Razor HTML emails in dotnet core 2在 dotnet core 2 中生成 Razor HTML 电子邮件
【发布时间】:2018-10-22 00:41:43
【问题描述】:

如何在 dotnetcore 中使用 Razor 生成电子邮件 (html),而不是从 MVC 应用程序(从控制台应用程序考虑)?

RazorEngine 在 .net 4.x 中表现出色,但在 dotnet core 中不适用。

RazorEngineLight 适用于 dotnet core 1.x,但不适用于 2.x。

这篇文章中提到了一些其他选项:Using Razor outside of MVC in .NET Core,但它们实际上都不能在 .net core 2.0 中工作

两年后编辑:

如果有人来这里寻找答案......我(OP)已经不再完全依赖 Razor 使用模板等生成电子邮件。它非常脆弱且容易出错 - 一个不停的头痛。这些天我更喜欢 Mandrill 或 Sendgrid - 使用模板。

【问题讨论】:

  • Using Razor outside of MVC in .NET Core 的回复很长,应该可以为您提供指导。
  • 谢谢,马克。它们是不错的选择,但我无法让它们中的任何一个工作。 :(
  • 您提到建议的选项不起作用。您能否在可用于重现问题的minimal reproducible example 中展示您到目前为止所做的工作以及它们在哪里引起了问题。也许我们可以从那里提供帮助。根据您对建议答案之一留下的评论,您似乎尚未注册依赖服务,但无法从您当前显示的内容中确定
  • 我可以向您展示我已经处理过的 4 个不同示例中的每一个,但由于我无法让其中任何一个工作,并且它们都没有经过验证在 .net core 2 中工作在 MVC 项目之外 - 我认为它只会增加混乱。我希望有人出现并说“嘿,我让 RazorLight 在控制台应用程序中的 .net core 2 中工作”——然后我们可以从那里拿走它。
  • 很公平。您留下评论的答案。这个答案简化了它的例子,我相信它在启动期间配置时省略了一些依赖服务,但想看看你做了什么,以便我可以根据你得到的错误识别丢失的服务。

标签: razor .net-core asp.net-core-2.0 razorengine


【解决方案1】:

this provided answer from the link provided 的评论中你说

我无法让它工作。我收到错误消息:尝试激活“Mvc.RenderViewToString.RazorViewToStringRenderer”时无法解析“Microsoft.AspNetCore.Mvc.Razor.IRazorViewEngine”类型的服务。”

这通常表示所需的服务未在服务集合中注册,因此提供者无法在需要时解析该服务。

那个答案没有提到额外的服务配置,只有

public void ConfigureServices(IServiceCollection services)
{
     services.AddScoped<IViewRender, ViewRender>();
}

因为它已经在 Asp.Net Core 环境中运行,这意味着在控制台应用程序中手动添加的服务已经在启动时完成。

注意这个来自the answer的sn-p,它与您评论的答案相关联。

private static void ConfigureDefaultServices(IServiceCollection services) {
    var applicationEnvironment = PlatformServices.Default.Application;
    services.AddSingleton(applicationEnvironment);

    var appDirectory = Directory.GetCurrentDirectory();

    var environment = new HostingEnvironment
    {
        WebRootFileProvider = new PhysicalFileProvider(appDirectory),
        ApplicationName = "RenderRazorToString"
    };
    services.AddSingleton<IHostingEnvironment>(environment);

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

    services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();

    var diagnosticSource = new DiagnosticListener("Microsoft.AspNetCore");
    services.AddSingleton<DiagnosticSource>(diagnosticSource);

    services.AddLogging();
    services.AddMvc();
    services.AddSingleton<RazorViewToStringRenderer>();
}

上面重要的部分是

services.AddMvc();

这会将相关的视图引擎依赖添加到服务集合中

MvcServiceCollectionExtensions.cs

public static IMvcBuilder AddMvc(this IServiceCollection services) {

    //...code removed for brevity

    // Default framework order
    builder.AddFormatterMappings();
    builder.AddViews();
    builder.AddRazorViewEngine();
    builder.AddRazorPages();
    builder.AddCacheTagHelper();

    //...code removed for brevity

}

目前呈现的所有其他内容都是合理的,应该可以按预期工作。

你应该审查

https://github.com/aspnet/Entropy/tree/93ee2cf54eb700c4bf8ad3251f627c8f1a07fb17/samples/Mvc.RenderViewToString

并遵循类似的结构以使代码在您的场景中工作。从那里您可以开始进行自定义修改并监控它在哪里中断。

.Net Core 的模块化特性允许进行自定义,因为可以剥离不同的模块并在其他环境中使用。

【讨论】:

  • 很好的答案,我认为这很接近......现在,我不明白的是,为了让 services.AddMvc() 工作,我需要参考什么?
  • @Kjensen 该扩展方法位于Microsoft.Extensions.DependencyInjection 命名空间中,但属于Microsoft.AspNetCore.Mvc 项目。查看 Github 上的源代码链接。
  • 设法更进一步......现在我被 CS0012 卡住了:“属性”类型是在未引用的程序集中定义的。您必须添加对程序集“netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”的引用。我已经添加了对 .net 标准的引用。这已经花费了我将近两天的时间,所以我放弃了,并打算创建一个特殊的 .net 4.x 项目,仅用于生成电子邮件,并包含在 web 服务中。我会给你赏金,因为这是最好的答案。
  • @Kjensen 尝试将&lt;PreserveCompilationContext&gt;true&lt;/PreserveCompilationContext&gt; 添加到您的 csproj 文件中。
  • 我试过了(在某处看到过),但没有帮助。 :( 但是谢谢
猜你喜欢
  • 2010-10-27
  • 2019-09-15
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多