
いつもお世話になっております。
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更新などが伴うと数百行になるため、すごく見通しが悪いです。全部別メソッドにするのも。。いい方法はないでしょうか
不明点だらけですんません(笑
どなたか愛の手を
No.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 …
ですかね。
shockatzさま、いつも有難うございます。
今回も有効なコンテンツを教えていただき、感謝雨あられです。
最後の「コントローラメソッドの拡張」ですが、全く理解できませんでした!(苦笑
お恥かしい限りです。
こういう記事に敬服するとともに、精進します!
No.1
- 回答日時:
まず、TempDataは使い方を間違ってるように思います。
TempDataというのは一種のSession変数ですので、ビューにデータを渡すのに使うというのはおかしいかと。
使うならViewBagかな?
MVCのバージョンによってはViewBagが使えないので、そのときはViewDataかなぁ。
あと、1つめと3つめの質問はある意味同じ回答になるかと。
サンプルとかだとコントローラにいろんな処理いれてしまいがちですが、コントローラはできるだけ薄くするべき、という考え方があったりします。
で、どうするか、というのは、、、そうですねぇ。MVCパターンの話を追いかけてみるとか、かなぁ。
責務をきちんと切り分けてクラスを設計しましょう、とかそういう話になるはず。
検証については、アクションの呼び出しの時点で行われているのはモデルバインダーがやってくれている部分です。
デフォルトのモデルバインダーを使うのではなく、独自のモデルバインダーを使うという方法が一つあります。
そのほうがうえで書いた責務をわける、という意味ではいいようにも思いますが。
コントローラーの中でやるべきかどうかは別として、検証プログラム書いて結果をModelStateに埋めこんでViewに渡すようなこともできます。
とりあえずはそんなとこですかね。
onos様、いつもありがとうございます。
ViewBagの件ですが、やはりコントローラからViewに返すのが正しい道でしょうね。
ご指摘ありがとうございます。
独自のモデルバインダの件、前回もご指摘いただいています。
正直難しくてよくわかりません。
こういうタイプの検証は頻繁に発生しそうなので、頭が痛いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
海外のファッションショーについて
-
「最遊記」の三蔵のモデルは誰...
-
下着モデルについて
-
ユニクロの広告のモデルの名前...
-
読者モデルの紙本葉月ちゃんで...
-
マンガ道の霧野涼子が死んだの...
-
モデルデビューは何歳までが適...
-
ポートレート(モデル)とかアイ...
-
少食の人って羨ましいです、ど...
-
よじごじdays
-
彼女が芸能活動(モデルなど)や...
-
子供の下着モデルとかってどう...
-
20歳、男です。 電車でそこそこ...
-
私は純日本人なのにロシア系の...
-
GcolleについてGcolleは違法ギ...
-
女の人は下の名前で呼ばれたい...
-
10月10日?発売予定の “Meta Qu...
-
CrystalDiskInfoの64bit版について
-
【NECノートPC】春モデルを買う...
-
「花だん」西門の優紀に対する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
海外のファッションショーについて
-
このモデルさんはなんという名...
-
なぜモデルはブスなのでしょう...
-
モデルさんの名前おしえてくだ...
-
このモデルさんの名前を教えて...
-
マンガ道の霧野涼子が死んだの...
-
NiziUミイヒの妹で、最近モデル...
-
この中国人か韓国人のモデルさ...
-
道端3姉妹って
-
下着モデルについて
-
「最遊記」の三蔵のモデルは誰...
-
氣志團「キラキラ!」の
-
「カードキャプターさくら」の...
-
誤解された(´・ω・`)
-
SEVENTEENモデルさんの桐谷美玲...
-
綺麗な女性が下着のモデルにな...
-
理研の看板の人はだれ?
-
坂井泉水さんのヘッドホン
-
ユニクロの広告のモデルの名前...
-
宮下美恵が復活させたヘアスプレー
おすすめ情報