TempData始终为空

Lad*_*nka 3 asp.net-mvc tempdata asp.net-mvc-2

我想使用TempData在Post和后续重定向之间存储消息,但TempData始终为空.

我有BaseContoller为传递TempData提供了一些基础设施.简化的代码如下所示:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

动作方法如下:

  [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});
  }
Run Code Online (Sandbox Code Playgroud)

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

代码有点简化.我们还使用防伪令牌,自定义过滤器进行授权和操作选择,但它不应影响TempData行为.

我不明白.我在测试应用程序之前使用过TempData,它工作正常.

que*_*rin 10

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

将调用移动GetAuditMessages()到OnActionExecuting方法,它将是可访问的.

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;
  }
}
Run Code Online (Sandbox Code Playgroud)