ASP.NET Core 2.1 中 ViewResultExecutor 的變化


之前在 ASP.NET Core 2.0 中可以正常運行的代碼:

var services = HttpContext.RequestServices;
var executor = services.GetRequiredService<ViewResultExecutor>();
var viewEngine = services.GetRequiredService<IRazorViewEngine>();
var view = viewEngine.GetView(null, "~/Pages/IeAlert.cshtml", true)?.View;
if (view != null)
{
    using (view as IDisposable)
    {
        await executor.ExecuteAsync(ControllerContext, view, ViewData, TempData, "text/html; charset=utf-8", 200);
    }
    return new EmptyResult();
} 

升級到 ASP.NET Core 2.1 之后出現下面的錯誤:

System.InvalidOperationException: No service for type 'Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor' has been registered.
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)

查看 ViewResultExecutor 的定義發現 ViewResultExecutor 實現了  IActionResultExecutor<ViewResult> 接口,查看最新的 ASP.NET Core MVC 的源代碼發現這樣的注冊:

services.TryAddSingleton<IActionResultExecutor<ViewResult>, ViewResultExecutor>();

原來 ViewResultExecutor 也被抽象了,於是改為下面的代碼解決了問題:

var services = HttpContext.RequestServices;
var executor = services.GetRequiredService<IActionResultExecutor<ViewResult>>() as ViewResultExecutor
    ?? throw new ArgumentNullException("executor");
var viewEngine = services.GetRequiredService<IRazorViewEngine>();
var view = viewEngine.GetView(null, "~/Pages/IeAlert.cshtml", true)?.View;
if (view != null)
{
    using (view as IDisposable)
    {
        await executor.ExecuteAsync(ControllerContext, view, ViewData, TempData, "text/html; charset=utf-8", 200);
    }
    return new EmptyResult();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM