Asp.net-Core-Mvc
在 ExecuteResult Asp.Net MVC Core 中訪問 TempData
我想保存通知
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. 它需要從ITempDataDictionaryFactoryvar 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); }但是,我還沒有完全理解為什麼呼叫非同步方法,因為控制器不是非同步的……需要對此做一些閱讀……
