Asp.net-Core-Mvc

在 ExecuteResult Asp.Net MVC Core 中訪問 TempData

  • January 1, 2017

我想保存通知TempData並顯示給使用者。我為此創建了擴展方法並實現了一個從ActionResult. 我需要使用TempData.override ExecuteResult``ActionContext

擴展方法:

public static IActionResult WithSuccess(this ActionResult result, string message)
{
   return new AlertDecoratorResult(result, "alert-success", message);
}

擴展 ActionResult 類。

public class AlertDecoratorResult : ActionResult
{
       public ActionResult InnerResult { get; set; }
       public string AlertClass { get; set; }
       public string Message { get; set; }
   public AlertDecoratorResult(ActionResult innerResult, string alertClass, string message)
   {
       InnerResult = innerResult;
       AlertClass = alertClass;
       Message = message;
   }

    public override void ExecuteResult(ActionContext context)
   {
       ITempDataDictionary tempData = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionary)) as ITempDataDictionary;

       var alerts = tempData.GetAlert();
       alerts.Add(new Alert(AlertClass, Message));
       InnerResult.ExecuteResult(context);
   }
}

從控制器呼叫擴展方法

return RedirectToAction("Index").WithSuccess("Category Created!");

我得到 ‘TempData’ null ,如何在 ‘ExecuteResult’ 方法中訪問 ‘TempData’。

在此處輸入圖像描述

我找到了獲取TempData. 它需要從ITempDataDictionaryFactory

var factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
var tempData = factory.GetTempData(context.HttpContext);

我今天確實在嘗試做同樣的事情(我們看過相同的 Pluralsight 課程嗎?;-))你的問題讓我找到瞭如何訪問 TempData(謝謝!)。

調試時,我發現我對 ExecuteResult 的覆蓋從未被呼叫,這導致我嘗試使用新的非同步版本。那行得通!

您需要做的是改寫 ExecuteResultAsync :

public override async Task ExecuteResultAsync(ActionContext context)
{
   ITempDataDictionaryFactory factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
   ITempDataDictionary tempData = factory.GetTempData(context.HttpContext);

   var alerts = tempData.GetAlert();
   alerts.Add(new Alert(AlertClass, Message));

   await InnerResult.ExecuteResultAsync(context);
}

但是,我還沒有完全理解為什麼呼叫非同步方法,因為控制器不是非同步的……需要對此做一些閱讀……

引用自:https://stackoverflow.com/questions/41200597