【问题标题】:Access TempData in ExecuteResult Asp.Net MVC Core在 ExecuteResult Asp.Net MVC Core 中访问 TempData
【发布时间】:2016-12-17 16:19:27
【问题描述】:

我想将通知保存在TempData 并显示给用户。我为此创建了扩展方法并实现了一个从ActionResult 扩展的类。我需要使用ActionContextoverride ExecuteResult 方法中访问TempData

扩展方法:

 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'。

【问题讨论】:

    标签: asp.net-core-mvc actionresult


    【解决方案1】:

    我今天确实在尝试做同样的事情(我们看过相同的 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);
    }
    

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

    【讨论】:

    • 是的,我们看的是同一门课程。调用了我的 ExecuteResult,但它没有将警报保留在 TempData 中。我也尝试了异步方法,但问题仍然相同。警报没有持续存在并且未显示在视图中。你能做到吗?
    • (抱歉耽搁了,新的一年来了 :-) 是的,它对我有用,我可以在我的视图中访问 TempData.GetAlerts 并从那里取回数据......不确定可能有什么不同:-/我必须启用涉及添加nuget包“Microsoft.AspNetCore.Session”和“Microsoft.Extensions.Caching.Memory”的会话,然后添加“services.AddMemoryCache(); services.AddSession() ;"在 Startup.cs 的 ConfigureServices 方法中。和“app.UseSession();”在配置方法中。
    • 我也是这样做的,但是在视图中访问TempData时,总是为空?
    • 有人知道这个吗?同样的问题,TempData 总是空的。
    • 我想你们在看我的课程! :) 我刚刚发布了一篇新博客,展示了在 ASP.NET Core 中使用警报消息技术的基础知识:trycatchfail.com/2018/01/22/…希望对您有所帮助!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2019-02-10
      • 1970-01-01
      • 2019-02-03
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多