0

我有一个名为的动作Messages,它有两种形式。

第一个表单发布到SendMessage,第二个发布到MessagesDelete。两个页面都返回ReturnToActionMessages 视图,并且都使用 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 将其作为模型中的属性。

4

1 回答 1

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

于 2012-04-17T15:15:47.787 回答