在ExecuteResult Asp.Net MVC Core中访问TempData

时间:2016-12-17 16:19:27

标签: asp.net-core-mvc actionresult

我想在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,我如何访问' TempData'在' ExecuteResult'方法

enter image description here

2 个答案:

答案 0 :(得分:5)

我今天真的想做同样的事情(我们看过同样的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);
}

但是,我还没有完全理解为什么调用异步方法因为控制器不是异步...需要对它进行一些阅读......

答案 1 :(得分:2)

我找到了获得TempData的方法。它需要从ITempDataDictionaryFactory

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