這個問題的答案是,對象是從表單中的POST數據重新構成的。這是相當基本的,但是MVC隱藏了很多事情,當你試圖獲得你的(MVC)軸承時很難看到。
項目的順序是:
- 了所有必要的字段創建表;對未顯示的鍵(ID)使用隱藏字段。
- 用戶與網頁交互;然後按下表單提交按鈕。
- 所有字段數據都被髮送到控制器頁面。
- MVC將數據重新組成類對象。
- 將控制器頁面與重新構造的類實例調用爲形式參數。
注:
創建頁面時:一個形式與用於對象的每個部分的場產生被表示。 MVC爲ID和其他非顯示數據以及驗證規則使用隱藏字段。
值得注意的是,由_CreateOrEdit.cshtml
頁面上列出的所有對象屬性所創建的形式(通常情況下)或者:
// Edit.cshtml
@model Person
@Html.Partial("_CreateOrEdit", Model)
和
// _CreateOrEdit.cshtml
@model Person
@Html.HiddenFor(model => model.PersonID)
@Html.LabelFor(model => model.first_name, "First Name")
@Html.EditorFor(model => model.first_name)
@Html.LabelFor(model => model.last_name, "Last Name")
@Html.EditorFor(model => model.last_name)
@Html.LabelFor(model => model.favorite_color, "Favorite Color")
@Html.EditorFor(model => model.favorite_color)
//etcetera
,或者通過使用模板類(模板必須與他們代表的班級名稱相同,他們位於Views\Shared\EditorTemplates
文件夾中)。
使用模板的頁面幾乎是相同的以前的方法:
// Edit.cshtml
@model Person
@Html.EditorForModel()
和
// Shared\EditorTemplates\Person.cshtml
@model Person
@Html.HiddenFor(model => model.PersonID)
@Html.LabelFor(model => model.first_name, "First Name")
@Html.EditorFor(model => model.first_name)
@Html.LabelFor(model => model.last_name, "Last Name")
@Html.EditorFor(model => model.last_name)
@Html.LabelFor(model => model.favorite_color, "Favorite Color")
@Html.EditorFor(model => model.favorite_color)
//etcetera
使用模板方法可以很容易地(的對象)列表添加到窗體。 Person.cshtml
變爲:
// Shared\EditorTemplates\Person.cshtml
@model Person
@Html.HiddenFor(model => model.PersonID)
@Html.LabelFor(model => model.first_name, "First Name")
@Html.EditorFor(model => model.first_name)
@Html.LabelFor(model => model.last_name, "Last Name")
@Html.EditorFor(model => model.last_name)
@Html.LabelFor(model => model.favorite_color, "Favorite Color")
@Html.EditorFor(model => model.favorite_color)
@EditorFor(model => model.Addresses)
//etcetera
和
// Shared\EditorTemplates\Address.cshtml
@model Address
@Html.HiddenFor(model => model.AddressID)
@Html.LabelFor(model => model.street, "Street")
@Html.EditorFor(model => model.street)
@Html.LabelFor(model => model.city, "City")
@Html.EditorFor(model => model.city)
//etcetera
MVC將處理在必要時創建的列表中的每個地址多份表單條目。
POST正好相反;創建模型對象的新實例,調用默認的無參數構造函數,然後MVC填充每個字段。通過顛倒@Html.EditorFor(model.List)
的序列化過程來填充列表。
public class Person
{
public List<Address> Addresses;
public Person()
{
// You always need to create this List object
Addresses = new List<Address>();
}
...
}
,涵蓋的是:需要注意的是,你必須確保你的類創建在構造函數列表中的有效容器否則MVC的名單重新憲法將失敗是很重要的。幕後有很多事情要做,但都是可追蹤的。
兩點很重要,如果你有麻煩與此:
- 請確保您有
@Html.HiddenFor(...)
爲需要「生存」之旅回服務器的一切。
- 使用Fiddler或HTTPLiveHeaders(Firefox插件)檢查POST數據的內容。這將讓您驗證正在發回的數據以重新構建新的類實例。我偏愛Fiddler,因爲你可以在任何瀏覽器中使用它(並且它特別好地顯示錶單數據)。
最後一點:有關於動態添加/刪除從MVC列表中元素的好文章:http://jarrettmeyer.com/post/2995732471/nested-collection-models-in-asp-net-mvc-3這是一個很好的文章,以合作,通過 - 是的,這確實與MVC3和剃刀工作。
因此,你實際上是一個人,你正在創造一個人嗎? – 2011-05-14 22:25:21
正確。編輯人員時,模型對象已經存在。創建人員時,模型對象爲空。 – 2011-05-15 16:46:14