2012-03-30 89 views
1

我有一個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參數,而不是完全沒有數據。

回答

1
class Address 
{ 
    public string Value; 
} 

應該是:

class Address 
{ 
    public string Value { get; set; } 
} 

默認的模型粘合劑與性能,而不是場工作。

還要確保生成的輸入字段名稱遵守standard convention

+0

工作完美。由於我一直在使用字段,否則使用屬性時沒有特殊的獲取或設置邏輯,所以我在默認情況下將屬性與默認的get相混淆,並使用公共字段進行設置。這個假設導致我在思想上忽略了關於模型綁定的信息談論屬性而不是字段的事實。我經常使用字段的做法可能是我應該糾正的一個錯誤。 – evizaer 2012-03-30 14:27:08

0

在我看來,這裏至少有兩個問題,都與模型有關。首先是發佈到您的調用中的對象是基於生成表單中輸入元素的id自動構建的。例如,以提取一個稱爲PERSONNAME屬性,就需要是類似的某處

<input type='whatever' id='PersonName' /> 

作爲這樣的標籤,這些性能必須能夠經由這樣的輸入來表示。

第二個問題源於此。使用MVC內置的ajax表單(與AJAX(通常和jQuery)相比是有限的),定義任何集合都沒有辦法(至少我知道),但特別是不像列表那樣通用。爲了使用MVC的AJAX來做到這一點,你可能需要一次爲一個人/用戶實現一個編輯器,並提交該數據(帶有單數或枚舉數量的地址)傳回。

另外,您可能希望重新考慮通過一次AJAX調用更新整個人羣。 AJAX的動態性更好地適用於更小,更頻繁的更新。

+0

我沒有這些問題。這是一個簡化的例子,它不能證明AJAX的使用是正確的,但是我將它包含在我的簡單例子中,因爲我認爲它可能對這個問題有一定的影響。通過使用@ Html.TextBoxFor(x => x.Thing)已經爲我生成了輸入,所以如果生成錯誤,它將是TextBoxFor/EditorFor的問題,而不是我。 – evizaer 2012-03-30 14:27:42