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 在一个页面上无限期地持久化,而不是在另一个页面上

看起来您正在尝试根据用户执行的操作向用户实施一次性消息。在这种情况下,我会以稍微不同的方式构建您的解决方案,而不是使用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)然后,

您只需要分配给该会话变量,您可以放心,下一个视图(而不是部分视图)会将一次性消息分配给视图模型,然后数据将被删除。