6

私はasp.netmvc3とjqueryの控えめな検証を使用しています。最近、標準のDataAnnotationsからFluentValidationに変更しましたが、うまく機能しています。

FluentValidationを選択した主な理由は、ビューモデルでネストされたプロパティを検証する必要があることでした(ただし、これを使用する他のクールな理由があることがわかりました)。

class Vm {
  string Prop;
  string AnotherProp;
  IEnumerable<ElementsVm> Elements;
}

class ElementsVm {
  bool Required;
  string Id;
  string Title;
  string Value;
}

FluentValidationを使用して、VmとElementVmのバリデーターを作成しました。単体テストは緑色で、サーバー側の検証が機能していることを示しています。

クライアント側、「Prop」および「AnotherProp」は機能しています-私の検証ルールも期待どおりにクライアント側で実行されています(DataAnnontationの場合と同様)が、すべての要素がクライアント側の検証をまったく取得していません-私は検査しますdomであり、すべてのdata-val、data-requiredなどの属性が欠落していることを確認できます。

ビューでhtmlを生成するためにさまざまなアプローチを試しましたが、「Prop」と「AnotherProp」はHtml.TextBoxFor(m => m.Prop)を使用して生成され、要素は部分的に生成されます。問題が始まります。Html.TextBoxFor(m => m.Value)を選択すると、すべての要素テキストボックスの名前/ IDが同じになるため、Html.TextBox(Model.Id)を使用して一意のID /名前を生成しようとしましたが、検証プロパティはありません。

だから私のセナリオを機能させる方法はあります-私はそれを少し書き直してもかまいませんが、FluentValidationに私のhtmlを書いてもらいたいです。

私のフォールバックソリューションは、属性を使用して正しいHtmlを生成するために独自のHtmlヘルパーを作成することですが、FluentValidation、jquery検証、または2つの間のmvcのリンク。

4

1 に答える 1

8

パーシャルでは、ElementsVMの各インスタンスの前に、次のようにViewData.TemplateInfo.HtmlFieldPrefixを使用して一意のプレフィックスを設定する必要があります。

var i = 0; 
foreach (var element in Model) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Elements[" + i.ToString() + "]"; 
    @Html.TextBoxFor(m => m.Value) 
    i++; 
}

これにより、目立たない検証属性が得られ、デフォルトのモデルバインダーでも機能するはずです。

カウンセラーベン

于 2011-04-13T04:02:28.883 に答える