我有一个名为Messages
的动作,它有两种形式。
第一个表单发布到SendMessage
,第二个表单发布到MessagesDelete
。两个页面都返回消息视图的ReturnToAction
,并且都使用TempData返回反馈数据(已发送消息,消息已删除等),表示已发生操作。
MessagesDelete
工作正常,第一次返回TempData,然后在将来的请求中删除它。另一方面,SendMessage
无休止地持续存在TempData。
这是一些简化的代码。
[Authorize]
public ActionResult Messages(int? id, string message)
{
MessagesModel model = new MessagesModel();
// build model data here
return View(model);
}
[Authorize]
[HttpPost]
public ActionResult MessagesDelete(int[] selectedObjects, int? id)
{
// delete objects
TempData["MessagesDeleted"] = selectedObjects.Count() + " deleted";
return RedirectToAction("Messages", new { id = id });
}
[Authorize]
[HttpPost]
public ActionResult SendMessage(SendMessageModel model)
{
// send my message
TempData["MessageSent"] = "message sent!";
return RedirectToAction(model.action, new { id = model.action_id } );
}
我能看到的唯一区别是MessagesDelete
直接发送id,而SendMessage将它作为模型中的属性。
答案 0 :(得分:1)
您似乎正在尝试根据用户执行的操作向用户实施一次性消息。在这种情况下,我会设法你的解决方案有点不同,而不是采取使用TempData
的头痛,这是不可靠的。
这就是我要做的事情:
1)为所有希望显示一次性消息的ViewModel创建一个基本ViewModel。
public class OneOffMessageViewModelBase
{
public string Message { get; set; }
}
2)然后,添加一个OnResultExecutingFilter以将数据从会话中提取到视图模型中的存储(或者,向基础控制器添加覆盖):
public class AllowOneOffMessagingAttribute : ActionFilterAttribute
{
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
var actionResult = filterContext.Result as ViewResult;
if(actionResult != null)
{
var viewModel = actionResult.ViewData.Model as OneOffMessageViewModelBase;
if(viewModel != null)
{
if(Session["OneOffMessage"] != null)
{
viewModel.Message = Session["OneOffMessage"];
Session["OneOffMessage"] = null;
}
}
}
}
}
3)然后,您只需要分配给该会话变量,并且可以确保下一个视图(而不是部分视图)将一次性消息分配给视图模型,然后数据将被删除。