2012-04-17 20 views
0

Messagesという2つのフォームを持つアクションがあります。TempData 1つのページに永続的に永続化する

最初のフォームはSendMessageに、2番目の投稿は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 }); 
    } 

私が見ることができる唯一の違いは、のSendMessageは、モデル内のプロパティとして有する一方MessagesDeleteは、直接IDを送信するということです。

+0

あなたのSendMessage ...アクションメソッドでは、どのアクションメソッドがリダイレクトされていますか?...それは... "return return RedirectToAction(model.action、new {id = model.action_id}); "...あなたは、そのアクションメソッドのコードを投稿することができます...私たちにもっと役立つかもしれません... – NiK

+0

私はあなたのSendMessageModelクラスのアクションプロパティの名前を変更しようとするかもしれません。私はプロパティのこの名前のクラスを持っていたと私はモデルバインディングで私のための問題を引き起こして覚えている。私はそれが何であったかを覚えていませんが、今私はそれを文書化したいと思っています... – ngm

答えて

1

あなたが取る行動に基づいてユーザーに一度限りのメッセージを実装しようとしているようです。このような状況では、私はTempDataを使用している頭痛を抱くこととは少し違って、あなたのソリューションを少し変えてしまいます。それは信頼できません。

は、ここで私はどうなるのかです:

1)一回限りのメッセージを表示することを期待し、すべてのviewmodelsためのベースビューモデルを作成します。

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

+0

これはポイント3の何かが私に考えを与えたが、これはクリーナーソリューションのように見える。 TempData ["MessageSent"]はメインのメッセージビューによって呼び出される部分的なビューでレンダリングされています。それが問題なのでしょうか? – roryok

+0

特定のパーシャルビューの場合は、このコードをOnResultExecutingではなく、その部分ビューのアクションメソッドに移動するだけで済みます。 – Tejs

+0

私は実際にこのようなことを計画していましたが、TempDataをViewDataに変換し、TempDataをnullに設定していました。私は本当にすっきりした方法があることを望んでいました。ありがとう – roryok

関連する問題