![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になっております。
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で質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下着モデルについて
-
中山こころ
-
【ASP.NET MVC】更新アクション
-
オールブランのCM
-
女子高生です。 身長154.5cm、...
-
不毛地帯で壱岐正のモデル瀬島...
-
芸能人とモデルの違いはなんで...
-
このモデルさんは何という名前...
-
モデルのレベルの低さ 最近、モ...
-
このモデルさんの名前を教えて...
-
彼女が芸能活動(モデルなど)や...
-
イギリス人ですけど日本でモデ...
-
坂井泉水さんのヘッドホン
-
この画像のモデルの方の 名前わ...
-
無印良品web:モデル女性のお名...
-
CW-X 肉離れの予防にはどのタ...
-
身長が153cm前後のモデルって誰...
-
26歳からモデルを目指す?
-
「最遊記」の三蔵のモデルは誰...
-
確定申告で、モデルのマネージ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファッションや雑誌のメンズモ...
-
今朝スリーサイズを測りました...
-
モデルのレベルの低さ 最近、モ...
-
なぜモデルはブスなのでしょう...
-
NiziUミイヒの妹で、最近モデル...
-
子供の下着モデルとかってどう...
-
海外のファッションショーについて
-
このモデルさんの名前を教えて...
-
綺麗な女性が下着のモデルにな...
-
やずやの香酢のCMの女の娘
-
外国人のモデルさんについて
-
ユニクロの広告のモデルの名前...
-
おさかな天国
-
このスタイルのいい女性の名前...
-
無印良品web:モデル女性のお名...
-
進撃の巨人モデル
-
実在の人物を漫画のキャラにす...
-
背が高くスタイルがいいけど顔...
-
理研の看板の人はだれ?
-
画像のモデルさんの名前を知りたい
おすすめ情報