電子書籍の厳選無料作品が豊富!

いつもお世話になっております。
ASP.NET MVCのコントローラで、フォーム送信を受けて動作する更新アクションの作り方について質問させてください。
いろいろな記事やチュートリアルを読んで、なんとか次のような基本計については理解できました。

public class HomeController
{

[HttpPost]
public ActionResult UpdateItem(Item item){

 if (! ModelState.IsValid){
  TempData["error"] = "入力内容にエラーがあります";
  return View("ItemEdit", item);
 } else {
  var result = false;
  //
  // 延々と更新メソッドが続く
  //
  if (result) {
    TempData["message"] = "正しく更新できました"
    ModelState.Clear();
    return Redirect("ItemList");
  } else {
    TempData["error"] = "更新でエラーが起きました";
    return View("ItemEdit", item);
  }
 }

}

}

TempData["xxx"]の処理は、ビュー側で、値に応じてjQueryUIによりダイアログを表示します。

質問したい箇所は以下の3つです。

■一体、全体の流れはこれでいいのでしょうか? if文とTempDataばっかりで。。何かスッキリしません。
■フォーム値の検証はアクション呼び出しの時点で終わっていますが、ここに任意の検証を入れたい場合はどうしたらいいのでしょう?
(必須や文字種チェックはモデルで属性設定を行っていますが、それ以外の例えば2項目が連動するような検証)
■サンプルの例文は簡単ですが、DB更新などが伴うと数百行になるため、すごく見通しが悪いです。全部別メソッドにするのも。。いい方法はないでしょうか

不明点だらけですんません(笑
どなたか愛の手を

A 回答 (2件)

こんにちは



■全体の流れ
検証NG、検証OK->更新OK、検証OK->更新NGと、きちんと処理が書かれているので、よくまとまっていると思います。
onosさんはViewBagでメッセージを返すように仰っていますがRedirectのように画面が遷移して、遷移後にメッセージを表示しなければいけない場合には、TempDataのほうが便利です(nayutaxさんのコードで気づきました^^; これ賢いやり方ですね)

■フォーム値の検証
モデルバインディングまで踏込むと大事になるので(笑、ここはカスタム検証を定義すればいいと思います。記述的にもすっきりするし。

http://cs.gogo-asp.net/blogs/naoki/archive/2010/ …

文献はMVC2ですが、そのまま動きます。
ASP.NET MVC3だと、確かクライアント検証が大幅に拡張されているはずですがそこまで調べてない(^^;

■コントローラメソッドの拡張
ここはやはり、IoCでしょう。
単体テストもできるようになるし、堅牢になるし、捗りますよ。

http://david9142.wordpress.com/2012/07/13/asp-ne …

ですかね。
    • good
    • 0
この回答へのお礼

shockatzさま、いつも有難うございます。

今回も有効なコンテンツを教えていただき、感謝雨あられです。
最後の「コントローラメソッドの拡張」ですが、全く理解できませんでした!(苦笑
お恥かしい限りです。
こういう記事に敬服するとともに、精進します!

お礼日時:2012/12/03 23:07

まず、TempDataは使い方を間違ってるように思います。


TempDataというのは一種のSession変数ですので、ビューにデータを渡すのに使うというのはおかしいかと。
使うならViewBagかな?
MVCのバージョンによってはViewBagが使えないので、そのときはViewDataかなぁ。

あと、1つめと3つめの質問はある意味同じ回答になるかと。
サンプルとかだとコントローラにいろんな処理いれてしまいがちですが、コントローラはできるだけ薄くするべき、という考え方があったりします。
で、どうするか、というのは、、、そうですねぇ。MVCパターンの話を追いかけてみるとか、かなぁ。
責務をきちんと切り分けてクラスを設計しましょう、とかそういう話になるはず。

検証については、アクションの呼び出しの時点で行われているのはモデルバインダーがやってくれている部分です。
デフォルトのモデルバインダーを使うのではなく、独自のモデルバインダーを使うという方法が一つあります。
そのほうがうえで書いた責務をわける、という意味ではいいようにも思いますが。
コントローラーの中でやるべきかどうかは別として、検証プログラム書いて結果をModelStateに埋めこんでViewに渡すようなこともできます。

とりあえずはそんなとこですかね。
    • good
    • 0
この回答へのお礼

onos様、いつもありがとうございます。
ViewBagの件ですが、やはりコントローラからViewに返すのが正しい道でしょうね。
ご指摘ありがとうございます。

独自のモデルバインダの件、前回もご指摘いただいています。
正直難しくてよくわかりません。
こういうタイプの検証は頻繁に発生しそうなので、頭が痛いです。

お礼日時:2012/12/03 23:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!