回答編集履歴

2

追記

2019/01/24 02:52

投稿

退会済みユーザー
answer CHANGED
@@ -72,4 +72,41 @@
72
72
  @Html.ValidationMessageFor(m => m.CountryList[i].Name)
73
73
  ```
74
74
 
75
- 私のレスをきちんと読んでもらっているでしょうか? 読んだけど意味不明だったということでしょうか?
75
+ 私のレスをきちんと読んでもらっているでしょうか? 読んだけど意味不明だったということでしょうか?
76
+
77
+ **【追記2】**
78
+
79
+ 下の 2019/01/24 11:04 の私のコメントで「レス不要かもしれませんが、気になった点がありますので、後で回答欄に追記しておきます」と書きましたが、それを以下に書きます。
80
+
81
+ 質問者さんが回答欄に追記された件に対するレスです。
82
+
83
+ > 数字入力のみのフォームに、文字を入力した際、モデルのErrorMessageが表示されるのは確認しました。
84
+
85
+ 私の回答欄に【追記】で書いた「TextBoxFor の方は、ダメだったような・・・」は思い違いでした。間違った情報ですみません。
86
+
87
+ EditorFor に代えて TextBoxFor を使っても、クライアント側の検証用に使う属性 data-val-* は付与され、クライアント側での jQuery / JavaScript による検証はかかることを確認しました。
88
+
89
+ 下の画像で、網掛けした方の input 要素が TextBoxFor 、その下の input 要素が EditorFor でレンダリングされたものです。
90
+
91
+ ![イメージ説明](21b58eb267eabbd0c6464a710d9e525b.jpeg)
92
+
93
+ ただし、Model のクラスのプロパティに付与した DisplayFormatAttribute が TextBoxFor では無視されます。
94
+
95
+ 属性は以下の画像の赤枠のように付与していますが、上の画像の赤枠で示した value 属性の通り、TextBoxFor でレンダリングすると無視されるようです。他にも期待通りの結果にならないことがあるかもしれず、要注意だと思います。
96
+
97
+ ![イメージ説明](cea21852de6e8f995f89c118e00429af.jpeg)
98
+
99
+ > idを指定しないと、「.」「[」「]」が「_」に変換されてしまうみたいで?
100
+
101
+ html コードを貼っていただいて意味が分かりました。そこは、上の画像でしめした通り、自分の環境でも同じです。
102
+
103
+ 裏技的な手段でコントロールする方法があるかもしれませんが、やり方は知りませんし、その必要もないと思っています。
104
+
105
+ id が勝手に書き換わると困るケースは、クライアントスクリプトで getElementById とかを使いたい場合がありますが、MVC4 以降には Html ヘルパーに IdFor メソッドが用意されていて、それを使えば html にレンダリングされた時の id の値は取得可能です。
106
+
107
+ 詳しくは以下の記事を見てください。
108
+
109
+ Control.ClientID と Html.IdFor
110
+ [http://surferonwww.info/BlogEngine/post/2017/02/19/control-clientid-and-html-idfor.aspx](http://surferonwww.info/BlogEngine/post/2017/02/19/control-clientid-and-html-idfor.aspx)
111
+
112
+ name 属性の値を取得したいというケースもあるかもしれませんが、そのための Html ヘルパー NameFor も用意されています。

1

追記

2019/01/24 02:52

投稿

退会済みユーザー
answer CHANGED
@@ -20,4 +20,56 @@
20
20
  ASP.NET MVC ラジオボタンのView/Controllerのやり取り
21
21
  [https://teratail.com/questions/151505](https://teratail.com/questions/151505)
22
22
 
23
- 不明点があれば質問してください。
23
+ 不明点があれば質問してください。
24
+
25
+ **【追記】**
26
+
27
+ 下の 2019/01/23 18:09 の私のコメントで「長くなりそうなので回答欄に追記します」と書きましたが、それを以下に書きます。
28
+
29
+ > EditorFor、TextBoxForの違いがわからなく
30
+
31
+ EditorFor を利用すると、モデルのプロパティの型によってレンダリングされる html 要素が適切に選ばれる(例: bool 型にするとチェックボックスになる)こと、プロパティ付与される DataType 属性によって、生成される html ソースの input 要素の type 属性が変わってくる(例:MultilineText の場合は input 要素でなく、textarea 要素になる)ことがあります。
32
+
33
+ あと、紹介した前者の記事にも書きましたが、ASP.NET がレンダリングする html 要素に、クライアントサイドでの jQuery ライブラリによる検証に必要な属性(例: data-val="true" など)が追加されないと、クライアント側での検証ができません。EditorFor を使用すると、クライアント側での検証に必要な属性が自動的に付与されます。
34
+
35
+ TextBoxFor の方は、ダメだったような・・・(定かではないです)
36
+
37
+ > EditorForですと、「text-box」「single-line」クラスが自動で付与されていたので、
38
+
39
+ class="text-box single-line" はデフォルトでハードコーディングされている属性だそうです。MVC 5.1 からは EditorFor にも任意の属性が付与できるようになりました。詳しくは以下の記事を見てください。
40
+
41
+ EditorFor での属性の付与方法
42
+ [http://surferonwww.info/BlogEngine/post/2018/02/23/how-to-pass-html-attributes-in-editorfor.aspx](http://surferonwww.info/BlogEngine/post/2018/02/23/how-to-pass-html-attributes-in-editorfor.aspx)
43
+
44
+ > idを指定しないと、「.」「[」「]」が「_」に変換されてしまうみたいで?
45
+
46
+ それはどういうことなのか分かりませんが、上に紹介した記事に書いたように、
47
+
48
+ ```
49
+ @Html.EditorFor(m => m.LastName,
50
+ new { htmlAttributes =
51
+ new { @class = "coolTextBox", data_date = "12-02-2012" } })
52
+ ```
53
+ とすれば、レンダリングされる html は以下のようになるのですが・・・
54
+
55
+ ```
56
+ <input
57
+ class="coolTextBox text-box single-line"
58
+ data-date="12-02-2012"
59
+ id="LastName"
60
+ name="LastName"
61
+ type="text"
62
+ value="Gee" />
63
+ ```
64
+
65
+ > 余談ですが、List型のValidationの結び付け方がわからなく、
66
+
67
+ それも紹介した記事「コレクションのデータアノテーション検証」に例が出ていますが、以下のようにすれば良いはずですけど・・・
68
+
69
+ ```
70
+ @Html.LabelFor(m => m.CountryList[i].Name)
71
+ @Html.EditorFor(m => m.CountryList[i].Name)
72
+ @Html.ValidationMessageFor(m => m.CountryList[i].Name)
73
+ ```
74
+
75
+ 私のレスをきちんと読んでもらっているでしょうか? 読んだけど意味不明だったということでしょうか?