自己解決したので解決方法を投稿し、クローズします。他に良い方法を記載できる場合を除いて、異論はお断りします。
・独自のクライアントのvalidationを設置した。
・Bootstrap5のvalidationを表示するためには
inputのid="Test"と、<div class="invalid-feedback" id="TestFeedBack">{{ message.Test }}</div>の組み合わせで、validationメッセージが表示できる。
今回、vue.js 3を使用していますので、エラーメッセージを表示したい時は v-bind:class で"is-invalid"クラスを追加してあげる。{{ message.Test }}にメッセージを入れてあげる。
・vue.js 3と独自validationを使用するため、formタグ中のASP.NET Core MVC特有のaspタグが不要になったので全て削除した。 ※aリンクとかで一部つかっている部分はあるが、formで使っているやつはいらないため全て削除した。
・サーバーのvalidationは今まで通り、ASP.NET Core MVCの ModelState.IsValid を利用。
・Vue.js 3 によってXSS対策はできているはずだが、もう少し調べてみようとは思う
・RequestVerificationTokenはそのまま使う。
・jquery、jquery-validationは一切不要になった。ただし、jquery、jquery-validationライブラリはASP.NET Core MVCのフレームワークのログイン認証関係で使用しているかもしれないため、削除しないようにした。
cshtml
1 // 画面
2 <div class="row mb-3">
3 <div class="col-md-3">
4 <label for="Test" class="col-form-label">@Html.DisplayNameFor(model => model.Test)</label> <span style="color: orange;">[必須]</span>
5 </div>
6 <div class="col-md-9">
7 <input type="text" class="form-control form-control-sm" id="Test" v-if="viewModel" v-bind:value.trim="viewModel.Test" v-bind:class="validationClass.Test" v-on:input="viewModel.Test = $event.target.value" />
8 <div class="invalid-feedback" id="TestFeedBack">{{ message.Test }}</div>
9 </div>
10 </div>
javascript
1 // クライアントのvalidation準備とデータ送信は以下のようにした
2 const app = Vue . createApp ( {
3 data ( ) {
4 return {
5 viewModel : {
6 Test : null
7 } ,
8
9 // Bootstrap5で独自Validationに使いたい変数を下記のように3種類用意した
10 validationClass : {
11 Test : null
12 } ,
13
14 validationRule : {
15 Test : [ "required" , "string-100" ]
16 } ,
17
18 message : {
19 Test : null
20 } ,
21 }
22 } ,
23
24 method : {
25 validationCheck ( ) {
26 this . isCheckedValidation = true ;
27
28 // this.viewModel独自に用意したvueの変数、formのプロパティそのものです。
29 const viewModel = JSON . parse ( JSON . stringify ( this . viewModel ) ) ;
30 const validationRule = JSON . parse ( JSON . stringify ( this . validationRule ) ) ;
31
32 for ( var propertyName in viewModel ) {
33 if ( propertyName in validationRule ) {
34 // isCheckedValidationはクライアント独自のValidationを設置。
35 var message = isCheckedValidation ( viewModel [ propertyName ] , validationRule [ propertyName ] ) ;
36
37 this . validationClass [ propertyName ] = null ;
38
39 if ( message != null ) {
40 this . message [ propertyName ] = message ;
41 this . validationClass [ propertyName ] = "is-invalid" ;
42
43 this . isCheckedValidation = false ;
44 }
45 }
46 }
47 } ,
48
49 // 送信 Formの送信は使わずaxiosで送信
50 onModalSubmitClicked ( ) {
51 // Data check ※inputのonChangeとかでvalidationをやってもいいけど、submitボタンを押した時にまとめてした
52 this . validationCheck ( ) ;
53
54 if ( ! this . isCheckedValidation ) {
55 return ;
56 }
57
58 const viewModel = JSON . parse ( JSON . stringify ( this . viewModel ) ) ;
59 const token = document . getElementsByName ( "__RequestVerificationToken" ) [ 0 ] . value ;
60
61 axios ( {
62 method : "post" ,
63 url : url ,
64 headers : {
65 "Content-Type" : "application/json; charset=UTF-8" ,
66 "RequestVerificationToken" : token
67 } ,
68 data : JSON . stringify ( viewModel )
69 } ) . then ( ( ) => {
70 // success
71 } ) . catch ( ( response ) => {
72 // failure
73 } ) ;
74 }
75 }
76 }