2011-04-01 7 views
6

私は、jqueryの控えめな検証でasp.net mvc 3を使用しています。私は最近、標準DataAnnotationsからFluentValidationに変更しました。mvc clientsideネストされた(コレクション)プロパティの検証

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

私はVMのとElementVmと私のユニットテストのためのバリデータは、サーバー側の検証が動作している私を示し、緑色で作るFluentValidationを使用して
class Vm { 
    string Prop; 
    string AnotherProp; 
    IEnumerable<ElementsVm> Elements; 
} 

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

クライアントサイド 'Prop'と 'AnotherProp'が動作しています - 検証ルールも(DataAnnontationの場合と同じように)クライアントサイドを実行していますが、すべての要素がクライアント側の検証をまったく取得していません - 私はDOMを検査し、すべてのdata-val、data-requiredなどの属性が欠落しているのを見ることができます。

私のビューでhtmlを生成するのにさまざまなアプローチを試みましたが、Html.TextBoxFor(m => m.Prop)を使って 'Prop'と 'AnotherProp'これが問題の始まりです。 Html.TextBoxFor(m => m.Value)を選択した場合、すべての要素テキストボックスに同じ名前/ IDが割り当てられるため、Html.TextBox(Model.Id)を使用してユニークなID /名前を生成しようとしましたが、 。

だから私のsenarioの仕事を作るための方法があります - 私はそれを少し書き換え気にしない、しかし、私は本当にFluentValidationのように私のための私のhtmlを書くことでしょう。

私のフォールバックの解決策は、属性を持つ正しいHTMLを生成するために自分のHtmlヘルパーを作ることですが、FluentValidationまたはFluentValidationに新しいリリース/パッチが作成されたときにそれらのヘルパーを更新し続ける必要があるので、 jqueryの検証または2つの間のmvcのリンク

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

これはあなたの控えめな検証属性を与える必要があり、また、動作するはずです:あなたの部分で

答えて

8

は、ElementsVMの各インスタンスの前に、あなたはそうのように、ViewData.TemplateInfo.HtmlFieldPrefixを使用して独自の接頭辞を設定する必要がありますデフォルトのモデルバインダーで置き換えます。

counsellorben

+0

ありがとう!これは機能し、答えとしてマークする必要があります。 – JustinP8

+1

また、ループの後に入力がある場合は、 'ViewData.TemplateInfo.HtmlFieldPrefix =" "'をリセットすることを忘れないでください。 – JustinP8

+0

@ JustinP8、@counsellorben、@Per:私は同じ問題を抱えていますが、これで修正されませんでした。私はネストされたコレクションのためにEditorTemplatesを使用しています。すべての 'input'タグの 'id'属性には適切な/要素 "Elements [0]"が既にプレフィックスされています。 'ViewData.TemplateInfo.HtmlFieldPrefix'は知っておくと便利ですが、私の問題ではありません。 @ 'データ値、データが必要な属性などが欠落しています。私は同じことに気づいた。 – tkerwood