Создание HTML-писем Razor в dotnet core 2 - PullRequest
0 голосов
/ 11 мая 2018

Как вы можете генерировать электронные письма (html), используя Razor в dotnetcore, а не из приложения MVC (например, из консольного приложения)?

RazorEngine отлично работает в .net 4.x, но не работает в ядре dotnet.

RazorEngineLight работает в ядре dotnet 1.x, но не в 2.x.

Некоторые другие опции упоминаются в этом посте: Использование Razor вне MVC в .NET Core , но ни один из них на самом деле не работает в .net core 2.0

1 Ответ

0 голосов
/ 14 мая 2018

В комментарии к предоставлен ответ по предоставленной ссылке Вы указали

Я не могу заставить это работать.Я получаю сообщение об ошибке: не удается разрешить службу для типа «Microsoft.AspNetCore.Mvc.Razor.IRazorViewEngine» при попытке активировать «Mvc.RenderViewToString.RazorViewToStringRenderer». '

Обычно это означает, что требуетсяслужба не была зарегистрирована в коллекции служб, поэтому поставщик не может разрешить службу при необходимости.

Этот ответ не относится к дополнительной конфигурации службы и содержит только

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

уже запускался в среде Asp.Net Core, что означало, что службы, добавленные вручную в консольное приложение, уже выполнялись при запуске.

Обратите внимание на этот фрагмент из ответа это было связано с ответом, который вы прокомментировали.

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 позволяет выполнять такие настройки, так как различные модули могут быть удалены и использованы в других средах.

...