簡體   English   中英

無法解析 Microsoft.AspNetCore.Mvc.Razor.IRazorViewEngine 類型的服務

[英]Unable to resolve service for type Microsoft.AspNetCore.Mvc.Razor.IRazorViewEngine

在我的core 2.2項目中,我有將Razor View作為字符串返回的標准服務(我需要它在用WPF編寫的客戶端中生成 pdf ):

public class RaportService : IRaportService
    {
        private readonly IProjectRepository projectRepository;
        private readonly IRazorViewEngine razorViewEngine;
        private readonly ITempDataProvider tempDataProvider;
        private readonly IServiceProvider serviceProvider;

        public RaportService(
            IProjectRepository projectRepository,
            IRazorViewEngine razorViewEngine,
            ITempDataProvider tempDataProvider,
            IServiceProvider serviceProvider)
        {
            this.projectRepository = projectRepository;
            this.razorViewEngine = razorViewEngine;
            this.tempDataProvider = tempDataProvider;
            this.serviceProvider = serviceProvider;
        }

        public async Task<string> GenerateProjectRaport(int projectId)
        {
            var project = await this.projectRepository.GetProjectWithTasksAsync(projectId)
                ?? throw new EntityNotFoundException();

            var httpContext = new DefaultHttpContext { RequestServices = this.serviceProvider };
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            using (var stringWriter = new StringWriter())
            {
                string viewPath = "~/wwwroot/RaportTemplate.cshtml";

                var viewResult = this.razorViewEngine.GetView(viewPath, viewPath, false);

                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                {
                    Model = new RaportViewModel
                    {
                        Project = project,
                        ProjectTasks = project.Tasks.ToList(),
                        ProjectEndedTasks = project.EndedTasks.ToList(),
                    }
                };

                var viewContext = new ViewContext(
                    actionContext,
                    viewResult.View,
                    viewDictionary,
                    new TempDataDictionary(actionContext.HttpContext, this.tempDataProvider),
                    stringWriter,
                    new HtmlHelperOptions());

                await viewResult.View.RenderAsync(viewContext);
                return stringWriter.ToString();
            }
        }
    }

Core 2.2一切正常。 當我將項目更新到Core 3.0此錯誤:

{
    "stackTrace":"   at MediatR.Internal.RequestHandlerBase.GetHandler[THandler](ServiceFactory factory)\r\n   
at MediatR.Internal.RequestHandlerWrapperImpl`2.<>c__DisplayClass0_0.<Handle>g__Handler|0()\r\n   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n   
at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate`1 next)\r\n  
 at TaskManager.Api.Controllers.RaportController.GetProjectRaport(Int32 projectId) in C:\\Users\\Michał\\Source\\Repos\\michasacuer\\TaskManager\\Src\\Web\\TaskManager.Api\\Controllers\\RaportController.cs:line 12\r\n   at lambda_method(Closure , Object )\r\n   
at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()\r\n   
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\r\n   
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)\r\n   
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\r\n  
 at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)\r\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\r\n   
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n  
 at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)",
    "message":"Error constructing handler for request of type MediatR.IRequestHandler`2[TaskManager.Application.Raport.Queries.GetProjectRaport.GetProjectRaportQuery,System.String]. Register your handlers with the container. See the samples in GitHub for examples."}

即使我在Startup注冊了IRazorViewEngine接口和類,它仍然會拋出,他需要一些調用IRazorPageFactoryProvider東西,但我不知道,它的實現是什么。

那么如何讓 Razor View Engine 與.NET Core 3.0一起工作呢?

我找到了解決方案。 當你想查看在RazorViewEngine.Net Core 3.0 (特別是在的WebAPI)此兩行添加到您的Startup.cs

services.AddControllersWithViews();
services.AddRazorPages();

解決方案是添加所需的服務。 以下代碼完成了這項工作。 在 Startup.cs 中,訣竅是從AddMvcCore()AddMvc獲取builder ,然后調用AddRazorViewEngine

var builder = services.AddMvcCore();
builder.AddRazorViewEngine();

如果您只想訪問RazorViewEngine您可以使用AddMvcCore().AddRazorViewEngine() 現在您只需使用 DI 即可在任何地方訪問它

public void ConfigureServices(IServiceCollection services) {
    ...
    services.AddMvcCore().AddRazorViewEngine();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM