回答編集履歴

3

追記

2019/02/11 01:19

投稿

退会済みユーザー
test CHANGED
@@ -62,7 +62,7 @@
62
62
 
63
63
 
64
64
 
65
- 結果、独自に追加したスクリプトと ASP.NET MVC の検証用スクリプトがバッティングすることなくクライアント側での検証は期待通り動きました。(さらなる検証は必要だと思いますが基本的な動きは OK でした)
65
+ 結果、独自に追加したスクリプトと ASP.NET MVC の検証用スクリプトがバッティングすることなくクライアント側での検証は期待通り動きました。(**さらなる検証は必要**だと思いますが基本的な動きは OK でした ← 下の 2019/02/11 10:15 の私のコメントを見てください
66
66
 
67
67
 
68
68
 

2

追記

2019/02/11 01:19

投稿

退会済みユーザー
test CHANGED
@@ -47,3 +47,495 @@
47
47
 
48
48
 
49
49
  自分が考えるとすると (2) かなぁ・・・という感じです。
50
+
51
+
52
+
53
+ **【追記】**
54
+
55
+
56
+
57
+ 上の質問に対する 2019/02/10 19:37 の私のコメントで「ご参考に検証に使ったコードを回答欄にアップしておきます」書きましたが、それを以下に書いておきます。
58
+
59
+
60
+
61
+ 先に自分が自分の環境で検証したコードに加えて、入力できる金額の範囲などを検証するデータアノテーション属性を追加し、質問者さんが質問にアップされたスクリプトと、shinji709 さんがアップされたコードの this を elm に変更したスクリプトを追加したものです。
62
+
63
+
64
+
65
+ 結果、独自に追加したスクリプトと ASP.NET MVC の検証用スクリプトがバッティングすることなくクライアント側での検証は期待通り動きました。(さらなる検証は必要だと思いますが基本的な動きは OK でした)
66
+
67
+
68
+
69
+ 変な先入観を持たず、諦めない心で何でもやってみるというのは大切なのだと今さらながら思い出し、自分としても勉強になりました。
70
+
71
+
72
+
73
+ 不明点があれば質問してください。
74
+
75
+
76
+
77
+ **Model**
78
+
79
+
80
+
81
+ ```
82
+
83
+ using System;
84
+
85
+ using System.Collections.Generic;
86
+
87
+ using System.Linq;
88
+
89
+ using System.Web;
90
+
91
+ using System.ComponentModel.DataAnnotations;
92
+
93
+ using System.ComponentModel.DataAnnotations.Schema;
94
+
95
+ using System.Globalization;
96
+
97
+
98
+
99
+ namespace Mvc5App2.Models
100
+
101
+ {
102
+
103
+ public class PurchaseRecord
104
+
105
+ {
106
+
107
+ [Display(Name = "ID")]
108
+
109
+ [Required(ErrorMessage = "{0} は必須")]
110
+
111
+ [RegularExpression(@"^\d{1,5}$", ErrorMessage = "数字 1 ~ 5 文字")]
112
+
113
+ public int ID { get; set; }
114
+
115
+
116
+
117
+ [Display(Name = "契約日")]
118
+
119
+ [Required(ErrorMessage = "{0} は必須")]
120
+
121
+ [RegularExpression(@"^\d{4}/\d{2}/\d{2}( \d{1,2}:\d{2}:\d{2})?$",
122
+
123
+ ErrorMessage = "yyyy/MM/dd 形式")]
124
+
125
+ [DisplayFormat(DataFormatString = "{0:yyyy年M月d日}")]
126
+
127
+ public DateTime ContractDate { get; set; }
128
+
129
+
130
+
131
+ [Display(Name = "価格")]
132
+
133
+ [Required(ErrorMessage = "{0} は必須")]
134
+
135
+ // RegularExpression がないと 1x というような文字列を入力すると "The field 価格 must be a number."
136
+
137
+ // という data-val-number 属性に設定されたエラーメッセージが出る。
138
+
139
+ [RegularExpression(@"^\d{1,6}$", ErrorMessage = "数字 1 ~ 6 文字")]
140
+
141
+ [Range(100, 10000, ErrorMessage = "{0}は{1}~{2}の間で入力してください。")]
142
+
143
+ [DisplayFormat(DataFormatString = "{0:N0}", ApplyFormatInEditMode = true)]
144
+
145
+ public decimal Price { get; set; }
146
+
147
+ }
148
+
149
+ }
150
+
151
+ ```
152
+
153
+
154
+
155
+
156
+
157
+ **View**
158
+
159
+
160
+
161
+ ```
162
+
163
+ @model Mvc5App2.Models.PurchaseRecord
164
+
165
+
166
+
167
+ @{
168
+
169
+ ViewBag.Title = "Edit";
170
+
171
+ }
172
+
173
+
174
+
175
+ <h2>Edit</h2>
176
+
177
+
178
+
179
+
180
+
181
+ @using (Html.BeginForm())
182
+
183
+ {
184
+
185
+ @Html.AntiForgeryToken()
186
+
187
+
188
+
189
+ <div class="form-horizontal">
190
+
191
+ <h4>PurchaseRecord</h4>
192
+
193
+ <hr />
194
+
195
+ @Html.ValidationSummary(true, "", new { @class = "text-danger" })
196
+
197
+
198
+
199
+ <div class="form-group">
200
+
201
+ @Html.LabelFor(model => model.ID, htmlAttributes: new { @class = "control-label col-md-2" })
202
+
203
+ <div class="col-md-10">
204
+
205
+ @Html.EditorFor(model => model.ID, new { htmlAttributes = new { @class = "form-control" } })
206
+
207
+ @Html.ValidationMessageFor(model => model.ID, "", new { @class = "text-danger" })
208
+
209
+ </div>
210
+
211
+ </div>
212
+
213
+
214
+
215
+ <div class="form-group">
216
+
217
+ @Html.LabelFor(model => model.ContractDate, htmlAttributes: new { @class = "control-label col-md-2" })
218
+
219
+ <div class="col-md-10">
220
+
221
+ @*@Html.EditorFor(model => model.ContractDate, new { htmlAttributes = new { @class = "form-control" } })*@
222
+
223
+ @Html.TextBoxFor(model => model.ContractDate, "{0:yyyy/MM/dd}", new { @class = "form-control" })
224
+
225
+ @Html.ValidationMessageFor(model => model.ContractDate, "", new { @class = "text-danger" })
226
+
227
+ </div>
228
+
229
+ </div>
230
+
231
+
232
+
233
+ <div class="form-group">
234
+
235
+ @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" })
236
+
237
+ <div class="col-md-10">
238
+
239
+ @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } })
240
+
241
+ @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" })
242
+
243
+ </div>
244
+
245
+ </div>
246
+
247
+
248
+
249
+ <div class="form-group">
250
+
251
+ <div class="col-md-offset-2 col-md-10">
252
+
253
+ <input type="submit" value="Save" class="btn btn-default" />
254
+
255
+ </div>
256
+
257
+ </div>
258
+
259
+ </div>
260
+
261
+ }
262
+
263
+
264
+
265
+ <div>
266
+
267
+ @Html.ActionLink("Back to List", "Index")
268
+
269
+ </div>
270
+
271
+
272
+
273
+ @section Scripts {
274
+
275
+ @Scripts.Render("~/bundles/jqueryval")
276
+
277
+
278
+
279
+ <script type="text/javascript">
280
+
281
+ //<![CDATA[
282
+
283
+
284
+
285
+ // これは shinji709 さんのコードの this を elm に変更
286
+
287
+ var form = document.getElementsByTagName('form')[0]
288
+
289
+ form.addEventListener('submit',
290
+
291
+ function () {
292
+
293
+ elm.value = delFigure(elm.value);
294
+
295
+ }, false);
296
+
297
+
298
+
299
+
300
+
301
+ // ここから下は質問者さんのコードをそのままコピペ
302
+
303
+
304
+
305
+ //出典: https://webllica.com/add-comma-as-thousands-separator/
306
+
307
+ //**** 画面表示完了後に、契約金額の表示をコンマ区切りとする ****
308
+
309
+ window.onload = function () {
310
+
311
+ elm.value = addFigure(document.getElementById("Price").value);
312
+
313
+ };
314
+
315
+
316
+
317
+ // * 数値の3桁カンマ区切り
318
+
319
+ // * 入力値をカンマ区切りにして返却
320
+
321
+ // * [引数] numVal: 入力数値
322
+
323
+ // * [返却値] String(): カンマ区切りされた文字列
324
+
325
+ // */
326
+
327
+ function addFigure(numVal) {
328
+
329
+ // 空の場合そのまま返却
330
+
331
+ if (numVal === '') {
332
+
333
+ return '';
334
+
335
+ }
336
+
337
+ // 全角から半角へ変換し、既にカンマが入力されていたら事前に削除
338
+
339
+ numVal = toHalfWidth(numVal).replace(/,/g, "").trim();
340
+
341
+ // 数値でなければそのまま返却
342
+
343
+ if (!/^[+|-]?(\d*)(.\d+)?$/.test(numVal)) {
344
+
345
+ return numVal;
346
+
347
+ }
348
+
349
+ // 整数部分と小数部分に分割
350
+
351
+ var numData = numVal.toString().split('.');
352
+
353
+ // 整数部分を3桁カンマ区切りへ
354
+
355
+ numData[0] = Number(numData[0]).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
356
+
357
+ // 小数部分と結合して返却
358
+
359
+ return numData.join('.');
360
+
361
+ }
362
+
363
+
364
+
365
+ ///**
366
+
367
+ // * カンマ外し
368
+
369
+ // * 入力値のカンマを取り除いて返却
370
+
371
+ // * [引数] strVal: 半角でカンマ区切りされた数値
372
+
373
+ // * [返却値] String(): カンマを削除した数値
374
+
375
+ // */
376
+
377
+ function delFigure(strVal) {
378
+
379
+ return strVal.replace(/,/g, "");
380
+
381
+ }
382
+
383
+
384
+
385
+ ///**
386
+
387
+ // * 全角から半角への変換関数
388
+
389
+ // * 入力値の英数記号を半角変換して返却
390
+
391
+ // * [引数] strVal: 入力値
392
+
393
+ // * [返却値] String(): 半角変換された文字列
394
+
395
+ // */
396
+
397
+ function toHalfWidth(strVal) {
398
+
399
+ // 半角変換
400
+
401
+ var halfVal = strVal.replace(/[!-~]/g,
402
+
403
+ function (tmpStr) {
404
+
405
+ // 文字コードをシフト
406
+
407
+ return String.fromCharCode(tmpStr.charCodeAt(0) - 0xFEE0);
408
+
409
+ });
410
+
411
+ return halfVal;
412
+
413
+ }
414
+
415
+
416
+
417
+ ///**
418
+
419
+ // * 処理を適用するテキストボックスへのイベント設定
420
+
421
+ // * Blur : カンマ区切り処理実施
422
+
423
+ // * Focus : カンマ削除処理実施
424
+
425
+ // */
426
+
427
+ var elm = document.getElementById('Price');
428
+
429
+
430
+
431
+ elm.addEventListener('blur',
432
+
433
+ function () {
434
+
435
+ this.value = addFigure(this.value);
436
+
437
+ }, false);
438
+
439
+
440
+
441
+ elm.addEventListener('focus',
442
+
443
+ function () {
444
+
445
+ this.value = delFigure(this.value);
446
+
447
+ }, false);
448
+
449
+ //]]>
450
+
451
+ </script>
452
+
453
+ }
454
+
455
+ ```
456
+
457
+
458
+
459
+
460
+
461
+ **Controller**
462
+
463
+
464
+
465
+ ```
466
+
467
+ using System;
468
+
469
+ using System.Collections.Generic;
470
+
471
+ using System.Linq;
472
+
473
+ using System.Web;
474
+
475
+ using System.Web.Mvc;
476
+
477
+ using Mvc5App2.Models;
478
+
479
+
480
+
481
+ namespace Mvc5App2.Controllers
482
+
483
+ {
484
+
485
+ public class HomeController : Controller
486
+
487
+ {
488
+
489
+ public ActionResult Edit()
490
+
491
+ {
492
+
493
+ PurchaseRecord model = new PurchaseRecord
494
+
495
+ {
496
+
497
+ ID = 1,
498
+
499
+ ContractDate = DateTime.Now,
500
+
501
+ Price = 1234m
502
+
503
+ };
504
+
505
+
506
+
507
+ return View(model);
508
+
509
+ }
510
+
511
+
512
+
513
+ [HttpPost]
514
+
515
+ [ValidateAntiForgeryToken]
516
+
517
+ public ActionResult Edit(PurchaseRecord model)
518
+
519
+ {
520
+
521
+ if (ModelState.IsValid)
522
+
523
+ {
524
+
525
+ // DB の編集処理
526
+
527
+ return RedirectToAction("Index");
528
+
529
+ }
530
+
531
+
532
+
533
+ return View(model);
534
+
535
+ }
536
+
537
+ }
538
+
539
+ }
540
+
541
+ ```

1

訂正

2019/02/10 10:48

投稿

退会済みユーザー
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- 回避できない場合は、\1,000 から 1000 に書き換えのために追加したスクリプトの動作と、ASP.NET MVC の検証用のスクリプトの動作に整合が取れるように、どちらかもしくは両方を書き直して対応できないかを検討するという話になると思います。
29
+ 回避できない場合は、~~\1,000~~ **1000** から ~~1000~~ **\1,000** に書き換えのために追加したスクリプトの動作と(**1000 と \1,000 が逆でした。訂正します**)、ASP.NET MVC の検証用のスクリプトの動作に整合が取れるように、どちらかもしくは両方を書き直して対応できないかを検討するという話になると思います。
30
30
 
31
31
 
32
32