2011-10-18 12 views
0

私は1つのコントローラで2つのアクションメソッドを有するMVC検証とエラー処理サイクル

ランキング:

public ActionResult Index(string url) 
{ 
    // take the url as a param and do long tasks here 
    ViewBag.PageTitle = "title"; 
    ViewBag.Images = "images"; 
    // and some more view bags 
    return View(); 
} 

このインデックスビューが同じコントローラに別の方法に投稿フォームを含みます。何かがのPostMessage方法で間違っていた場合Indexビューに戻り、また、フォームフィールドをクリアしていない、プラスのPostMessageメソッドは、指定されたエラーメッセージを表示する方法

public ActionResult PostMessage(string msg, string imgName) 
{ 
    // save data in the db 
    // but on error I want to navigate back to the Index view but without losing data the user fielded before submit the form. 
    // Also need to pass an error message to this index view to show 
} 

このようなシナリオを実行するためのベストプラクティスを知る必要があります。

答えて

1

最善のアプローチは、フォーム用のViewModelタイプを作成することが通常です。そのモデルのプロパティに属性を追加して、何が「間違っている」かを定義します。様々なフィールドのようなフォームを使用する方法を@Html.TextBoxForにしてください。メッセージと画像の名前を直接取るのではなく、あなたのPostMessageクラスがその型のオブジェクトを取るようにしてください。モデルが無効であれば、モデルを検証してビューを再度返すことができます。

このパターンの後のコード例については、http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspxを参照してください。

1

あなたが戻りたいビューの名前を指定することができます。

public ActionResult PostMessage(string msg, string imgName) 
{ 
    if (SomeErrorWhileSavingInDb) 
    { 
     // something wrong happened => we could add a modelstate error 
     // explaining the reason and return the Index view. 
     ModelState.AddModelError("key", "something very wrong happened when trying to process your request"); 
     return View("Index"); 
    } 

    // everything went fine => we can redirect 
    return RedirectToAction("Success"); 
} 
+0

と、私が表示するインデックスビューからインデックスビューに送信していたViewBagについては、この場合はnullです。 –

+1

@Amr ElGarhy、同じビューを再表示する場合は、 'PostMessage'で再度設定する必要があります。ところで、あなたはViewBagを使うべきではありません。ビューモデルを使用することをお勧めします。 –

0

戻ったばかりの

return RedirectToAction("Index"); 

は、あなたがルート値やその他の情報を渡すことができますこのメソッドのオーバーロードがありますindexアクションにリダイレクトします。

+0

この方法では、ユーザーが入力フィールドに入力したすべての値が失われます。あなたが毎回サーバー側のエラーがある場合は、最初からやり直さなければならない場合は、迷惑をかけます。 –

関連する問題