回答編集履歴

2

追記

2019/01/24 02:52

投稿

退会済みユーザー
test CHANGED
@@ -147,3 +147,77 @@
147
147
 
148
148
 
149
149
  私のレスをきちんと読んでもらっているでしょうか? 読んだけど意味不明だったということでしょうか?
150
+
151
+
152
+
153
+ **【追記2】**
154
+
155
+
156
+
157
+ 下の 2019/01/24 11:04 の私のコメントで「レス不要かもしれませんが、気になった点がありますので、後で回答欄に追記しておきます」と書きましたが、それを以下に書きます。
158
+
159
+
160
+
161
+ 質問者さんが回答欄に追記された件に対するレスです。
162
+
163
+
164
+
165
+ > 数字入力のみのフォームに、文字を入力した際、モデルのErrorMessageが表示されるのは確認しました。
166
+
167
+
168
+
169
+ 私の回答欄に【追記】で書いた「TextBoxFor の方は、ダメだったような・・・」は思い違いでした。間違った情報ですみません。
170
+
171
+
172
+
173
+ EditorFor に代えて TextBoxFor を使っても、クライアント側の検証用に使う属性 data-val-* は付与され、クライアント側での jQuery / JavaScript による検証はかかることを確認しました。
174
+
175
+
176
+
177
+ 下の画像で、網掛けした方の input 要素が TextBoxFor 、その下の input 要素が EditorFor でレンダリングされたものです。
178
+
179
+
180
+
181
+ ![イメージ説明](21b58eb267eabbd0c6464a710d9e525b.jpeg)
182
+
183
+
184
+
185
+ ただし、Model のクラスのプロパティに付与した DisplayFormatAttribute が TextBoxFor では無視されます。
186
+
187
+
188
+
189
+ 属性は以下の画像の赤枠のように付与していますが、上の画像の赤枠で示した value 属性の通り、TextBoxFor でレンダリングすると無視されるようです。他にも期待通りの結果にならないことがあるかもしれず、要注意だと思います。
190
+
191
+
192
+
193
+ ![イメージ説明](cea21852de6e8f995f89c118e00429af.jpeg)
194
+
195
+
196
+
197
+ > idを指定しないと、「.」「[」「]」が「_」に変換されてしまうみたいで?
198
+
199
+
200
+
201
+ html コードを貼っていただいて意味が分かりました。そこは、上の画像でしめした通り、自分の環境でも同じです。
202
+
203
+
204
+
205
+ 裏技的な手段でコントロールする方法があるかもしれませんが、やり方は知りませんし、その必要もないと思っています。
206
+
207
+
208
+
209
+ id が勝手に書き換わると困るケースは、クライアントスクリプトで getElementById とかを使いたい場合がありますが、MVC4 以降には Html ヘルパーに IdFor メソッドが用意されていて、それを使えば html にレンダリングされた時の id の値は取得可能です。
210
+
211
+
212
+
213
+ 詳しくは以下の記事を見てください。
214
+
215
+
216
+
217
+ Control.ClientID と Html.IdFor
218
+
219
+ [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)
220
+
221
+
222
+
223
+ name 属性の値を取得したいというケースもあるかもしれませんが、そのための Html ヘルパー NameFor も用意されています。

1

追記

2019/01/24 02:52

投稿

退会済みユーザー
test CHANGED
@@ -43,3 +43,107 @@
43
43
 
44
44
 
45
45
  不明点があれば質問してください。
46
+
47
+
48
+
49
+ **【追記】**
50
+
51
+
52
+
53
+ 下の 2019/01/23 18:09 の私のコメントで「長くなりそうなので回答欄に追記します」と書きましたが、それを以下に書きます。
54
+
55
+
56
+
57
+ > EditorFor、TextBoxForの違いがわからなく
58
+
59
+
60
+
61
+ EditorFor を利用すると、モデルのプロパティの型によってレンダリングされる html 要素が適切に選ばれる(例: bool 型にするとチェックボックスになる)こと、プロパティ付与される DataType 属性によって、生成される html ソースの input 要素の type 属性が変わってくる(例:MultilineText の場合は input 要素でなく、textarea 要素になる)ことがあります。
62
+
63
+
64
+
65
+ あと、紹介した前者の記事にも書きましたが、ASP.NET がレンダリングする html 要素に、クライアントサイドでの jQuery ライブラリによる検証に必要な属性(例: data-val="true" など)が追加されないと、クライアント側での検証ができません。EditorFor を使用すると、クライアント側での検証に必要な属性が自動的に付与されます。
66
+
67
+
68
+
69
+ TextBoxFor の方は、ダメだったような・・・(定かではないです)
70
+
71
+
72
+
73
+ > EditorForですと、「text-box」「single-line」クラスが自動で付与されていたので、
74
+
75
+
76
+
77
+ class="text-box single-line" はデフォルトでハードコーディングされている属性だそうです。MVC 5.1 からは EditorFor にも任意の属性が付与できるようになりました。詳しくは以下の記事を見てください。
78
+
79
+
80
+
81
+ EditorFor での属性の付与方法
82
+
83
+ [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)
84
+
85
+
86
+
87
+ > idを指定しないと、「.」「[」「]」が「_」に変換されてしまうみたいで?
88
+
89
+
90
+
91
+ それはどういうことなのか分かりませんが、上に紹介した記事に書いたように、
92
+
93
+
94
+
95
+ ```
96
+
97
+ @Html.EditorFor(m => m.LastName,
98
+
99
+ new { htmlAttributes =
100
+
101
+ new { @class = "coolTextBox", data_date = "12-02-2012" } })
102
+
103
+ ```
104
+
105
+ とすれば、レンダリングされる html は以下のようになるのですが・・・
106
+
107
+
108
+
109
+ ```
110
+
111
+ <input
112
+
113
+ class="coolTextBox text-box single-line"
114
+
115
+ data-date="12-02-2012"
116
+
117
+ id="LastName"
118
+
119
+ name="LastName"
120
+
121
+ type="text"
122
+
123
+ value="Gee" />
124
+
125
+ ```
126
+
127
+
128
+
129
+ > 余談ですが、List型のValidationの結び付け方がわからなく、
130
+
131
+
132
+
133
+ それも紹介した記事「コレクションのデータアノテーション検証」に例が出ていますが、以下のようにすれば良いはずですけど・・・
134
+
135
+
136
+
137
+ ```
138
+
139
+ @Html.LabelFor(m => m.CountryList[i].Name)
140
+
141
+ @Html.EditorFor(m => m.CountryList[i].Name)
142
+
143
+ @Html.ValidationMessageFor(m => m.CountryList[i].Name)
144
+
145
+ ```
146
+
147
+
148
+
149
+ 私のレスをきちんと読んでもらっているでしょうか? 読んだけど意味不明だったということでしょうか?