我有一個PersonEditorModel,它包含我想在編輯器中表示的人員列表。我有一個包含Address對象集合的Person對象集合。我想爲所有這些渲染文本框,以便用戶可以編輯與這些名稱關聯的名稱和地址。收集數據在發佈後不會顯示在模型中。 (包括集合集合)
class PersonEditorModel
{
public List<Person> People;
}
class Person
{
public string Name;
public List<Address> Addresses;
}
class Address
{
public string Value;
}
我正在生成一個表單,用於編輯與它們關聯的地址和名稱。它使用的是Ajax.BeginForm,因爲這是一個簡化的例子,來自於我在一個更大的應用程序中使用Ajax獲取結果更新頁面的不同部分的問題。
在鹼形式的CSHTML:
@model Models.PersonEditorModel
@using (Ajax.BeginForm("Update", new AjaxOptions { HttpMethod = "Post" }))
{
<div>
@Html.EditorFor(x => x.People)
<button type="submit">Commit Changes</button>
</div>
}
Person.cshtml:
@model Models.Person
<div> @Html.TextBoxFor(x => x.Name) </div>
<div> @Html.EditorFor(x => x.Addresses) </div>
Address.cshtml:
@model Models.Address
<div> @Html.TextBoxFor(x => x.Value) </div>
控制器的爲動作方法:
public ActionResult Update(List<Person> people) { /* snip */ }
當我提交這個表單時,立即在Update()中放置的斷點顯示「people」是一個正確長度的列表,但它絕對不包含任何數據 - 所有地址都是空字符串,即使表單數據爲出現在Request.Form中看起來正確。
什麼可能導致這樣的問題,什麼是一種慣用的MVC方式來解決這個問題?
注意:這是我在更復雜的應用程序中看到的一些行爲的簡化示例。我想我已經在這裏抓住了這個問題的本質,但可能還有一些其他未知的複雜因素。讓我知道是什麼可能會導致我看到的問題複雜化,我會盡力提供任何額外的細節,我可以。
我試着讓更新採取一個PersonEditorModel參數,而不是完全沒有數據。
工作完美。由於我一直在使用字段,否則使用屬性時沒有特殊的獲取或設置邏輯,所以我在默認情況下將屬性與默認的get相混淆,並使用公共字段進行設置。這個假設導致我在思想上忽略了關於模型綁定的信息談論屬性而不是字段的事實。我經常使用字段的做法可能是我應該糾正的一個錯誤。 – evizaer 2012-03-30 14:27:08