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)
| 归档时间: |
|
| 查看次数: |
3637 次 |
| 最近记录: |