2016-04-26 12 views
1

私のAsp.Net MVC 5プロジェクトの1つをAsp.Net Coreに移行します。私は、リクエストがajaxリクエストであればビューを部分ビューとしてレンダリングするカスタムActionResultを持っていて、リクエストが通常のリクエストであった場合、ビューを通常のビューとしてレンダリングします。古いExecuteResultを新しいExecuteResultAsyncに変換する際に問題があります。 - >するactionContext移行ASP.Net MVC 5 ExecuteResultをASP.Netに変換する方法ExecuteResultAsync

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である:それは私の半分は、コードを変換され、ここで

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()); 
     } 
    } 

そして:

は、ここでは、私の古いコードです。 ControllerContextをActionContextに変換する手助けをしてください。どうもありがとうございました!

答えて

0

本当に素早く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); 
    } 
} 
+0

ありがとうございます、私はそれをチェックします! – martonx

+0

この行には次のエラーがあります。var tempData = new TempDataDictionary(context.HttpContext、tempDataProvider); //引数1: 'Microsoft.AspNet.Http.HttpContext'から 'Microsoft.AspNet.Http.IHttpContextAccessor'に変換できません。 – martonx

+0

これは正しい行でなければなりません。var tempData = new TempDataDictionary(新しいHttpContextAccessor {HttpContext = context.HttpContext} 、tempDataProvider); – martonx