【问题标题】:Using TempData outside controller在控制器外使用 TempData
【发布时间】:2015-12-10 17:04:30
【问题描述】:

我正在创建ControllerFactory。在这个类中,我想在方法CreateController 中访问所有控制器都可以访问的TempData 变量。

public class ControllerFactory : IControllerFactory
{
    public IController CreateController(RequestContext requestContext, string controllerName)
    {
        //TODO :IoC implementation or call comes here.
        return null;
    }

    public void ReleaseController(IController controller)
    {
      var disposable = controller as IDisposable;
      if (disposable != null)
      {
        disposable.Dispose();
      }
    }

    public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        //HERE I WANT TO HAVE ACCESS TO THE TempData
    }

    public SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        return SessionStateBehavior.Default;
    }
}

注意:在调用页面时,代码到达控制器之前,函数CreateController会显示它到达的这段代码。

知道如何在CreateController 方法中访问TempData

【问题讨论】:

  • 我不认为 TempData 是你认为的那样。 TempData 是一个临时字典,仅适用于一次读取(访问一次后它会自行删除)。我很难在控制器工厂中找到任何有用的 TempData 用法,因为控制器/视图中的数据将不再存在。而且,更重要的是,如果用户按 F5,数据将消失,因此控制器工厂将不再需要重新渲染页面。 TempData基本只对短通知消息之类有用,页面刷新不需要重新渲染。
  • 我给你举个例子,以便更好地理解。如果 TempaData["object"] != null 我想构建控制器 1,如果不是,我想构建默认控制器。所以,要做到这一点,我需要访问我的 ControllerFactory 中的临时数据。请注意,TempData["object"] 可以是任何控制器的字段。
  • 好的,但是当你这样做 TempData["object"] != null 时,它会删除它,这是你想要的吗?
  • 是的,我知道,这就是我想要的

标签: c# asp.net-mvc controller


【解决方案1】:

在 ASP.NET Core MVC 源代码中他们这样做

var tempDataDictionaryFactory = context.RequestServices.GetRequiredService<ITempDataDictionaryFactory>();
var tempDataDictionary = tempDataDictionaryFactory.GetTempData(context);
if (tempDataDictionary.TryGetValue(MyClaims.Claim1, out object value))
{
    return (string)value;
}

上下文是HttpContext

这对我来说很完美

【讨论】:

猜你喜欢
  • 2015-01-21
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多