ASP.NET MVC +流暢検証+部分表示>クライアント側の検証なし
-
21-12-2019 - |
質問
FluentValidationを使用して、My ASP.NET MVC 5.1 ViewModelsを検証します(デフォルトの未不正なクライアル側検証を使用して)。 NINJECTを介してバリデータを登録/作成します(ViewModelsの属性なし):
FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel));
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType));
.
私はアプリケーション全体でしばしば使用される部分的なビューを持っています。この部分的なビューには独自のViewModelがあります。 "Main" ViewModel(ビュー全体のもの)は、この「部分的な」ビューモデルから継承しています。
public class IndexViewModel : PersonalInfoViewModel { ... }
.
バリエータで同じパターンを使用します。
public class IndexValidator : PersonalInfoValidator { ... }
.
は、「メイン」ビューのクライアント側の検証と同様に、ファインとサーバー側の検証が機能します。ただし、部分ビューのクライアント側の検証はトリガされません(そこの入力フィールドにはdata-val-*
属性はありません)。
マイ「メイン」ビューIndex.cshtml
@model IndexViewModel
@Html.TextBoxFor(x => x.SomeProperty) // client-side validation works fine
@Html.Partial("PersonalInfo") // client-side validation in the partial view does not work (see below)
.
私の部分的なビューPersonalInfo.cshtml
:
@model PersonalInfoViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation does not work
.
部分的なビューのモデルを "MAIN" ViewModel:
に変更したときに機能することに気づいた@model IndexViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation works
.
だから私はクライアント側の検証を構築するときにどこかであると思います正しいバリデータはピックアップされず、data-val-*
属性はHTMLに注入されません。しかし、「メイン」ビューの異なるいくつかの異なるページで使用されているため、部分的なビューでViewModelを変更できません(PersonalInfoviewModelから継承されます)。
この場合に私のクライアント側の検証を行う方法についてのアイデアは?
更新
ASP.NET WebStackソースを掘る数時間後、TextBoxFor
メソッドで問題が発生しているようです。そこにModelMetaData
がモデルから作成され、そこでそこでそこでIndexViewModel
の代わりにPersonalInfoViewModel
を使用してクライアント側の検証のメタデータを取得します。
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Html.GetUnobtrusiveValidationAttributes("FirstName", metadata); // no client-side validation attributes found
.
しかし、これはメタデータを明示的に指定しない場合、正しいクライアント側の検証属性を生成します。
Html.GetUnobtrusiveValidationAttributes("FirstName");
.
残念ながら、私はこれまでの利点についてこの知識を使う方法を見つけていません。
解決
私は私の問題に対する素晴らしい解決策を見つけることができず、ASP.Net WebStackのソースを演奏したくなかったので、私は醜い回避策で解決しました:
i "i" Inputフィールドをレンダリングするときに欠けているdata-val-*
属性をこのように注入します。
@Html.TextBoxFor(x => x.FirstName, Html.GetUnobtrusiveValidationAttributes("FirstName"))
.
GetUnobtrusiveValidationAttributes
(スタンドアロンと呼ばれる)は正しいHTML属性を構築しているため、テキストボックスを追加して追加します。絶対に美しくてはいけませんが、それはうまくいきます、そして私は私の仕事と一緒に行くことができます。誰かがより良い解決策を持っているならば、私はそれを聞いてとてもうれしいです。