teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2019/01/08 08:33

投稿

退会済みユーザー
answer CHANGED
@@ -18,4 +18,33 @@
18
18
  他に CustomrValitdation 属性を作って使用する方法もあります。どちらが良いかの議論は以下のスレッドにありますので興味があれば見てください。
19
19
 
20
20
  MVC モデルのバリデーションについて
21
- [https://teratail.com/questions/80391](https://teratail.com/questions/80391)
21
+ [https://teratail.com/questions/80391](https://teratail.com/questions/80391)
22
+
23
+ **【追記】**
24
+
25
+ 下の 2019/01/08 17:21 の私のコメントで「回答欄に追記します」と書きましたが、それを以下に書きます。
26
+
27
+ > ValidationResultをPostで判定する方法はありますか?
28
+
29
+ そもそも、サーバー側での検証は、GET 側のアクションメソッドで初期画面が表示された後、それが POST された時でないとかからないです。
30
+
31
+ 基本は以下のコードの通りで、モデルバインディングの際にモデルに付与したデータアノテーション属性によって検証が行われ、検証結果が OK の場合は ModelState.IsValid が true に、NG の場合は false になります。
32
+
33
+ ```
34
+ [HttpPost]
35
+ [ValidateAntiForgeryToken]
36
+ public ActionResult Create([Bind(Include = "No, Project")] TestViewModel model)
37
+ {
38
+ if (ModelState.IsValid)
39
+ {
40
+ // INSERT 処理
41
+ return RedirectToAction("Index");
42
+ }
43
+
44
+ return View(model);
45
+ }
46
+ ```
47
+
48
+ 上のコードのように、ModelState.IsValid が true の場合は DB への登録などの処置を行って別のページにリダイレクト、false の場合は retrun View(model); としユーザーに訂正と再送を促すというのが普通のパターンです。
49
+
50
+ 検証 NG で retrun View(model); とするのはちゃんと理由があって、POST されてきたユーザー入力をそのまま(間違っていても間違ったまま)表示して、間違っている箇所にはエラーメッセ―ジを表示し、訂正を容易にするためです。