在 ExecuteResult Asp.Net MVC Core 中访问 TempData
Access TempData in ExecuteResult Asp.Net MVC Core
我想在 TempData
中保存通知并显示给用户。我为此创建了扩展方法并实现了一个从 ActionResult
扩展的 class。我需要使用 ActionContext
.
在 override ExecuteResult
方法中访问 TempData
扩展方法:
public static IActionResult WithSuccess(this ActionResult result, string message)
{
return new AlertDecoratorResult(result, "alert-success", message);
}
扩展 ActionResult class。
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'。
我今天确实在尝试做同样的事情(我们看过相同的 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);
}
但是,我还没有完全理解为什么调用异步方法,因为控制器不是异步的...需要做一些阅读...
我找到了获得TempData
的方法。它需要从 ITempDataDictionaryFactory
var factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
var tempData = factory.GetTempData(context.HttpContext);
我想在 TempData
中保存通知并显示给用户。我为此创建了扩展方法并实现了一个从 ActionResult
扩展的 class。我需要使用 ActionContext
.
override ExecuteResult
方法中访问 TempData
扩展方法:
public static IActionResult WithSuccess(this ActionResult result, string message)
{
return new AlertDecoratorResult(result, "alert-success", message);
}
扩展 ActionResult class。
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'。
我今天确实在尝试做同样的事情(我们看过相同的 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);
}
但是,我还没有完全理解为什么调用异步方法,因为控制器不是异步的...需要做一些阅读...
我找到了获得TempData
的方法。它需要从 ITempDataDictionaryFactory
var factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
var tempData = factory.GetTempData(context.HttpContext);