0

Messages私は2つのフォームを持つというアクションを持っています。

最初のフォームは にポストしSendMessage、2 番目のフォームは にポストし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

ユーザーの行動に基づいて、ユーザーに 1 回限りのメッセージを実装しようとしているようです。このような状況では、私はあなたのソリューションを少し違った方法で設計したいと思いますTempData.

これが私がすることです:

1) 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) 次に、そのセッション変数に割り当てるだけで、次のビュー (部分ビューではない) が 1 回限りのメッセージをビュー モデルに割り当て、データが削除されることが保証されます。

于 2012-04-17T15:15:47.787 に答える