TempData 在一个页面上无限期地持久化,而不是在另一个页面上
本文关键字:持久化 另一个 无限期 一个 TempData | 更新日期: 2023-09-27 18:31:20
我有一个名为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 将其作为模型中的属性。
看起来您正在尝试根据用户执行的操作向用户实施一次性消息。在这种情况下,我会以稍微不同的方式构建您的解决方案,而不是使用TempData
并且不可靠。
以下是我会做的:
1) 为所有希望显示一次性消息的视图模型创建一个基本视图模型。
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)然后,您只需要分配给该会话变量,您可以放心,下一个视图(而不是部分视图)会将一次性消息分配给视图模型,然后数据将被删除。