7

検証にデータ注釈を使用して、文字列を含むIEnumerableがあります。

[Required(ErrorMessage = "This is required.")]
[Remote("IsValid", "ControllerName")]
public IEnumerable<string> MyList { get; set; }    

次に、これをエディターテンプレートで使用しています。これは私が私の見解でそれを呼ぶ方法です:

@Html.EditorFor(m => m.MyList)

最後に、私のテンプレートはこのIEnumarableを受け取り、要素ごとにいくつかのフォーム要素を作成します。

@model IEnumerable<string>
@foreach (var str in Model)
{
    <li>
        @Html.LabelFor(m => str, "My Label")
        @Html.TextBoxFor(m => str)
        @Html.ValidationMessageFor(m => str)
    </li>
}

フォーム要素は正しくレンダリングされますが、これに正しく近づいていますか?また、検証されなくなったことにも気づきました。どうすればこれを解決できますか?

4

2 に答える 2

7

あなたはそれを「正しい」方法で行っています。(動作するという点で正しいです。以前にこれを実行しました)しかし、検証で動作しないと思う理由はこれです。文字列ではなく、IEnemerableで検証が行われます。各文字列の検証を取得します。新しいモデルオブジェクトを作成する必要があります

public class LabelString
{
    [Required(ErrorMessage = "This is required.")]
    public string labelName { get; set; }
}

そして、あなたがpublic IEnumerable<string> MyList { get; set; } それを置き換えた場所public IEnumerable<LabelString> MyList { get; set; }

これにより、forループ内の各ラベルの検証が可能になります。

于 2012-08-27T02:54:57.423 に答える
3

それは数学ではないので、あなたの問題には複数の解決策があり、正しいものはありません

ただし、私は別の方法でアプローチしたいと思います。

public class StringsViewModel
{
   IEnumerable<string> myList;
}

ビューでは、次に必要になります

@model StringsViewModel
@EditorForModel()

一般的なモデルではなく、強く型付けされたモデルがあるため、検証されます。また、フレームワークによって自動的に行われるループを節約できますforeach...

お役に立てれば。

于 2012-08-27T02:58:15.767 に答える