【问题标题】:How to convert ASP.Net MVC 5 ExecuteResult to ASP.Net Core ExecuteResultAsync如何将 ASP.Net MVC 5 ExecuteResult 转换为 ASP.Net Core ExecuteResultAsync
【发布时间】:2016-04-27 06:12:15
【问题描述】:

我正在将我的一个 Asp.Net MVC 5 项目迁移到 Asp.Net Core。我有一个自定义 ActionResult,如果请求是 ajax 请求,它将视图呈现为部分视图,如果请求是正常请求,则将视图呈现为带有布局的普通视图。我在将旧的 ExecuteResult 转换为新的 ExecuteResultAsync 时遇到问题。

这是我的旧代码:

public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Buffer = true;
        context.Controller.ViewData.Model = Model;

        using (var sw = new StringWriter())
        {
            var request = context.RequestContext.HttpContext.Request;

            if (string.IsNullOrEmpty(ViewName))
            {
                ViewName = request.RequestContext.RouteData.GetRequiredString("action");
            }

            var viewResult = request.IsAjaxRequest()
                ? ViewEngines.Engines.FindPartialView(context, ViewName)
                : ViewEngines.Engines.FindView(context, ViewName, "_Layout");

            var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw);
            viewResult.View.Render(viewContext, sw);
            context.HttpContext.Response.Write(sw.GetStringBuilder().ToString());
        }
    }

这是我的半转换代码:

public override async Task ExecuteResultAsync(ActionContext context)
    {
        context.HttpContext.Response.Buffer = true; //broken
        context.HttpContext.Controller.ViewData.Model = Model; //broken

        using (var sw = new StringWriter())
        {
            var request = context.HttpContext.Request;

            if (string.IsNullOrEmpty(ViewName))
                ViewName = context.ActionDescriptor.Name;

            var engine = context.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;

            var viewResult = request.Headers["X-Requested-With"] == "XMLHttpRequest"
                ? engine.FindPartialView(context, ViewName)
                : engine.FindView(context, ViewName);

            var viewContext = new ViewContext(context, viewResult.View, context.Controller.ViewData, context.Controller.TempData, sw, new HtmlHelperOptions()); //broken
            await viewResult.View.RenderAsync(viewContext);
            await context.HttpContext.Response.WriteAsync(sw.GetStringBuilder().ToString());
        }
    }

我的主要问题是 ControllerContext -> ActionContext 迁移。请帮我将 ControllerContext 转换为 ActionContext。非常感谢!

【问题讨论】:

    标签: asp.net-mvc-5 asp.net-core


    【解决方案1】:

    嗯,将一些东西放在一起以快速安装 RC2 位。随意改进它:

    public override async Task ExecuteResultAsync(ActionContext context)
    {
        var request = context.HttpContext.Request;
    
        if (string.IsNullOrEmpty(ViewName))
        {
            ViewName = context.ActionDescriptor.Name;
        }
    
        var engine = context.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
    
        var viewResult = engine.FindView(context, ViewName, isMainPage: request.Headers["X-Requested-With"] != "XMLHttpRequest");
        var tempDataProvider = context.HttpContext.RequestServices.GetService(typeof(ITempDataProvider)) as ITempDataProvider;
        var modelMetaDataProvider = context.HttpContext.RequestServices.GetService(typeof(IModelMetadataProvider)) as IModelMetadataProvider;
    
        using (var writer = new HttpResponseStreamWriter(context.HttpContext.Response.Body, Encoding.UTF8))
        {
            var tempData = new TempDataDictionary(context.HttpContext, tempDataProvider);
            var viewData = new ViewDataDictionary(modelMetaDataProvider, context.ModelState)
            {
                Model = Model
            };
            var viewContext = new ViewContext(
                context,
                viewResult.View,
                viewData,
                tempData,
                writer,
                new HtmlHelperOptions());
    
            await viewResult.View.RenderAsync(viewContext);
        }
    }
    

    【讨论】:

    • 谢谢,我会查的!
    • 这一行有这个错误: var tempData = new TempDataDictionary(context.HttpContext, tempDataProvider); //参数1:无法从'Microsoft.AspNet.Http.HttpContext'转换为'Microsoft.AspNet.Http.IHttpContextAccessor'
    • 这应该是正确的行:var tempData = new TempDataDictionary(new HttpContextAccessor { HttpContext = context.HttpContext }, tempDataProvider);
    • 注意,我的位是 RC2 的 :)
    • 最好将此示例重写为新版本。 :)
    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2018-12-19
    • 2020-08-23
    相关资源
    最近更新 更多