次のオブジェクトがあるとします。
public class Address
{
public String Line1 { get; set; }
public String Line2 { get; set; }
public String City { get; set; }
public String State { get; set; }
public String ZipCode { get; set; }
public Address()
{
}
}
public class Contact
{
public String FirstName { get; set; }
public String LastName { get; set; }
public String Telephone { get; set; }
public Address BillingAddress { get; set; }
public List<Address> ShippingAddresses { get; set; }
public Contact()
{
// Assume anything that _could_ be null wouldn't be. I'm excluding
// most "typical" error checking just to keep the examples simple
this.BillingAddress = new Address();
this.ShippingAddresses = new List<Address>();
}
}
[Required]
プロパティが、[Display]
およびその他の属性で装飾されていると想定します。
次に、私のコントローラー(デモのために簡略化):
public ActionResult Edit(String id)
{
Contact contact = ContactManager.FindByID(id);
return View(model: contact);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact contact)
{
if (ModelState.IsValid) //always fails
{
ContactManager.Save(contact);
return RedirectToAction("Saved");
}
return View(model: contact);
}
私はMVCでこのようなオブジェクトを編集するデモを見続けていますが、それらは常にオブジェクトのコレクションを独自の形式に分割しています(たとえば、連絡先を編集してから、連絡先から特定のアドレスを編集します)。一方、私は同じページ内でこのすべての情報を編集しようとしていますが、成功していません。例えば:
@model Contact
// simplified for brevity
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.FirstName): @Html.EditorFor(x => x.FirstName)
@Html.LabelFor(x => x.LastName): @Html.EditorFor(x => x.LastName)
@Html.LabelFor(x => x.Telephone): @Html.EditorFor(x => x.Telephone)
<div>
@Html.LabelFor(x => x.BillingAddress.Line1): @Html.EditorFor(x => x.BillingAddress.Line1)
@Html.LabelFor(x => x.BillingAddress.Line2): @Html.EditorFor(x => x.BillingAddress.Line2)
@Html.LabelFor(x => x.BillingAddress.City): @Html.EditorFor(x => x.BillingAddress.City)
@Html.LabelFor(x => x.BillingAddress.State): @Html.EditorFor(x => x.BillingAddress.State)
@Html.LabelFor(x => x.BillingAddress.ZipCode): @Html.EditorFor(x => x.BillingAddress.ZipCode)
</div>
<div>
@foreach (Address addr in Model.ShippingAddresses)
{
<div>
@Html.LabelFor(x => addr.Line1): @Html.EditorFor(x => addr.Line1)
@Html.LabelFor(x => addr.Line2): @Html.EditorFor(x => addr.Line2)
@Html.LabelFor(x => addr.City): @Html.EditorFor(x => addr.City)
@Html.LabelFor(x => addr.State): @Html.EditorFor(x => addr.State)
@Html.LabelFor(x => addr.ZipCode): @Html.EditorFor(x => addr.ZipCode)
</div>
}
</div>
}
私が遭遇し続ける問題はModelState.IsValid
、情報を保存しに行くときに決して通過しないということです。これを行うためのトリックはありますか、それともMVCの領域のすぐ外にありますか?のようなオブジェクトを取得Contact
して、編集のためにすべての情報を1ページにダンプし、正常に再保存してもらいたいのですが、動作させることができないようです。(私の次のステップは、ajaxを結び付けて、そのページの「ShipingAddresses」を動的に追加/削除できるようにすることですが、最初に保存を機能させる必要があります--KISS)
問題:
ModelState.IsValid
ほとんどの場合false- コレクションアイテムのフォーム要素は同じ名前であることが多いため、このデモ
Line1
では、コレクション内のすべてが、私が期待するようなものではなくShippingAddresses
、ページにダンプされます。name="addr_Line1"
ShippingAddresses[0]_Line1