我想使用 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;
}
}
动作方法如下所示:
[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 Development Web 服务器上进行了测试。没有 Ajax 调用,我从母版页中删除了所有 Html.RenderAction 调用。我可以看到 TempData 在 GetAuditedMessages 中的每个请求仅被访问一次,并且在 OnResultExecuting 中仅存储一次。没有任何东西会覆盖数据。允许会话状态。
代码稍微简化了一点。我们还使用防伪令牌、用于授权和操作选择的自定义过滤器,但它不应影响 TempData 行为。
我不明白。我之前在测试应用程序中使用过 TempData,它运行良好。