TempData在一个页面上无限期地保留,而不是在另一个页面上

时间:2012-04-17 15:00:59

标签: c# asp.net-mvc .net-4.0

我有一个名为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将它作为模型中的属性。

1 个答案:

答案 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)然后,您只需要分配给该会话变量,并且可以确保下一个视图(而不是部分视图)将一次性消息分配给视图模型,然后数据将被删除。