首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TempData始终为空

TempData始终为空
EN

Stack Overflow用户
提问于 2011-01-13 22:26:26
回答 3查看 3.9K关注 0票数 3

我想使用TempData来存储Post和followed重定向之间的消息,但是TempData总是空的。

我让BaseContoller为通过TempData提供了一些基础设施。简化的代码如下所示:

代码语言:javascript
复制
public abstract class BaseController : Controller
{
  public const string AuditMessagesKey = "AuditMessages";

  private List<InformationMessage> _informationMessages = new List<InformationMessage>();

  protected BaseController()
  {
    // I also tried this in overriden Initialize
    ViewData[AuditMessagesKey] = GetAuditMessages();
  }

  protected void AddAuditMessage(InformationMessage message)
  {
    if (message == null)
      return;

     _informationMessages.Add(message);
  }

  protected override void OnResultExecuting(ResultExecutingContext filterContext)
  {
    base.OnResultExecuting(filterContext);

    if (filterContext.Result is RedirectToRouteResult)
    {
      // I see that messages are stored into TempData
      TempData[AuditMessagesKey] = _informationMessages;
      // This also doesn't help
      // TempData.Keep(AuditMessagesKey);
    }
  }

  private ICollection<InformationMessage> GetAuditMessages()
  {
    // TempData are always empty here
    var messages = TempData[AuditMessagesKey] as List<InformationMessage>;

    if (messages == null)
    {
      messages = new List<InformationMessage>();
    }

    return messages;
  }
}

Action方法看起来像:

代码语言:javascript
复制
  [HttpPost]
  public ActionResult CancelEdit(RequestSaveModel model)
  {
    AddAuditMessage(new InformationMessage
      {
        Message = String.Format(Messages.RequestEditationCanceled, model.Title),
        Severity = MessageSeverity.Information
      });

    return RedirectToAction("Detail", new { Id = model.Id});
  }

应用程序在VS开发web服务器上进行了测试。没有Ajax调用,并且我从我的母版页中删除了所有Html.RenderAction调用。我可以看到,在GetAuditedMessages中,每个请求只访问一次TempData,并且在OnResultExecuting中只存储一次。任何内容都不会覆盖数据。允许使用会话状态。

代码稍微简化了一点。我们还使用了防伪令牌,用于授权和操作选择的自定义筛选器,但它不应该影响TempData行为。

我不明白。我以前在测试应用程序中使用过TempData,它工作得很好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 00:19:49

我在你的代码中看到的问题是,你试图在控制器的构造函数中从TempData中检索数据--在它可用之前。

将对GetAuditMessages()的调用移到一个OnActionExecuting方法中,它就可以访问了。

代码语言:javascript
复制
public abstract class BaseController : Controller
{
  public const string AuditMessagesKey = "AuditMessages";

  private List<InformationMessage> _informationMessages = new List<InformationMessage>();

  protected BaseController()
  {
    // TempData is not available yet
  }

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
      ViewData[AuditMessagesKey] = GetAuditMessages();

      base.OnActionExecuting(filterContext);
  }

  protected void AddAuditMessage(InformationMessage message)
  {
    if (message == null)
      return;

     _informationMessages.Add(message);
  }

  protected override void OnResultExecuting(ResultExecutingContext filterContext)
  {
    base.OnResultExecuting(filterContext);

    if (filterContext.Result is RedirectToRouteResult)
    {
      // I see that messages are stored into TempData
      TempData[AuditMessagesKey] = _informationMessages;
      // This also doesn't help
      // TempData.Keep(AuditMessagesKey);
    }
  }

  private ICollection<InformationMessage> GetAuditMessages()
  {
    var messages = TempData[AuditMessagesKey] as List<InformationMessage>;

    if (messages == null)
    {
      messages = new List<InformationMessage>();
    }

    return messages;
  }
}
票数 10
EN

Stack Overflow用户

发布于 2011-01-14 04:00:58

我认为这就是正在发生的事情:

在CancelEdit中,返回RedirectToAction,框架重定向到"Detail“。在你的细节方法中,ActionExecuting被触发,但是它的filterContext.Result不是你的RedirectToAction结果--它是一个新的结果(实际上,到目前为止还没有结果)。

你需要检查"filterContext.Result is RedirectToRouteResult“吗?在执行重定向之前,您似乎只会添加这些消息。

票数 1
EN

Stack Overflow用户

发布于 2018-07-21 16:13:14

在我的解决方案中,我忘了为我的开发移除HttpCookies,它只能在Https发布的网站上运行

代码语言:javascript
复制
<httpCookies httpOnlyCookies="true" requireSSL="true"  />
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4681092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档