Ahm*_*mar 4 actionresult asp.net-core-mvc
我想保存通知TempData并显示给用户。我为此创建了扩展方法,并实现了一个从扩展的类ActionResult。我需要访问TempData的override ExecuteResult法ActionContext。
扩展方式:
public static IActionResult WithSuccess(this ActionResult result, string message)
{
return new AlertDecoratorResult(result, "alert-success", message);
}
Run Code Online (Sandbox Code Playgroud)
扩展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);
}
}
Run Code Online (Sandbox Code Playgroud)
来自控制器的呼叫扩展方法
return RedirectToAction("Index").WithSuccess("Category Created!");
Run Code Online (Sandbox Code Playgroud)
我得到'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);
}
Run Code Online (Sandbox Code Playgroud)
但是,我还没有完全理解为什么调用异步方法,因为控制器不是异步的。需要对此做一些阅读...
我找到了获得 的方法TempData。它需要从ITempDataDictionaryFactory
var factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory;
var tempData = factory.GetTempData(context.HttpContext);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |