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