0

2 つのビュー モデルがあり、1 つはもう 1 つのコレクションを集約します。

class Parent 
{
   public string Key { get; set; }
   public IList<Child> Children { get; set; }
}

class Child
{
   public string Key { get; set; }

   [Required, Remote("VerifyNameUnique", "Parent", AdditionalFields = "Key", ErrorMessage = "The name must be unique.")]
   public string Name { get; set; }
}

コントローラーアクションがあります

public ActionResult VerifyNameUnique(string key, string name)
{
    var result = // ... verify uniqueness
    return Json(result, JsonRequestBehavior.AllowGet);
}

そしてビュー:

@model Parent
@Html.HiddenFor(m => m.Key)
@for(var i=0; i<Model.Children; i++)
{
   @Html.HiddenFor (m => m.Children[i].Key)
   @Html.LabelFor(m => m.Children[i].Name)
   @Html.EditorFor (m => m.Children[i].Name)
}

親/子エディター テンプレートが Name フィールドのいずれかを検証するアクションを呼び出すと、 querystring が送信されます?Children[0].Key=abc&Children[0].Name=Fred。ここで、は編集したばかりの子0のインデックスです。i

VerifyNameUniqueプレフィックスのため、これは のパラメーターにバインドされません。接頭辞セットで使ってみBindAttributeたのですが、 の値によって接頭辞が変わりますi

カスタム モデル バインダーを作成することはオプションですが、この単純なシナリオではやり過ぎのように思えます。私にできるもっと良いことはありますか?

4

1 に答える 1

1

これは単にサポートされていません。したがって、カスタムモデルバインダーまたはカスタムリモート検証属性を作成する必要があります。そうは言っても、ユーザーが送信ボタンをクリックすると、コレクション内のすべてのフィールドにAJAXリクエストが送信されるため、達成しようとしていることはあまり良い考えではありません。これはあまり効率的ではありません。サーバーへの1回のラウンドトリップですべてを検証するために、親のコレクションプロパティに直接カスタムリモート検証フィールドを使用することになるでしょう。

于 2012-07-19T14:35:39.510 に答える