2012-09-08 74 views
4

此問題可能是對上一個問題的重申,如果是請發佈鏈接。無論哪種方式,我仍然會通過這篇文章。爲父模型獲取子集合HttpPost更新

我有這樣的模式:

public class Employee { 
    //omitted for brevity 

    public virtual ICollection<ProfessionalExperience> ProfessionalExperiences { get; set; } 
    public virtual ICollection<EducationalHistory> EducationalHistories { get; set; } 
} 

public class ProfessionalExperience { 
    // omitted for brevity 
} 

public class EducationalHistory { 
    // omitted for brevity 
} 

我顯示我查看了此操作:

[HttpGet] 
public ActionResult Edit(int id) { 
    using(var context = new EPMSContext()) { 
     var employees = context.Employees.Include("ProfessionalExperiences").Include("EducationalHistories"); 

     var employee = (from item in employees 
         where item.EmployeeId == id && item.IsDeleted == false 
         select item).FirstOrDefault(); 

     return View(employee); 
    } 
} 

這是我的觀點:

@using(Html.BeginForm()) { 
    <div class="editor-label">First Name:</div> 
    <div class="editor-field">@Html.TextBoxFor(x => x.FirstName)</div> 
    <div class="editor-label">Middle Name:</div> 
    <div class="editor-field">@Html.TextBoxFor(x => x.MiddleName)</div> 

    @foreach(var item in Model.ProfessionalExperiences) { 
     Html.RenderPartial("ProfExpPartial", item); 
    } 

    @foreach(var item in Model.EducationalHistories) { 
     Html.RenderPartial("EducHistPartial", item); 
    } 
    <input type="submit" value="Save" /> 
} 

我在上顯示兒童收藏查看使用foreach並使用每個集合的局部視圖。

當調用我的Post Edit Action時,employee模型將子集合設置爲null。

[HttpPost] 
public ActionResult Edit(Employee employee) { 
    using(var context = new EPMSContext()) { 

    } 

    return View(); 
} 

我錯過了什麼讓子集合正確?

謝謝!

+0

你可以顯示你用來發起POST請求的代碼嗎?同樣顯示一個HTTP POST請求的例子也會有幫助,例如你在發佈什麼數據?這聽起來像ASP.NET無法反序列化該集合,所以它會幫助查看您嘗試發送的數據。 –

+0

我已更新我的問題,希望我的建議正確無誤。 –

+0

另外,我已經檢查了Request.Form對象,並且看到集合在請求中。我將如何使我的子集合被包含在我傳遞的Employee對象中? –

回答

2

我認爲這個問題與MVC期望構建集合元素的方式(它們的名稱在html中)有關。 看看這個SO回答:https://stackoverflow.com/a/6212877/1373170,尤其是鏈接到斯科特漢塞爾曼的post

您的問題在於,如果您手動迭代並執行個別調用RenderPartial(),輸入字段將不會有索引,並且DefaultModelBinder將不知道如何構建您的集合。

我個人會爲您的兩種ViewModel類型創建Editor Templates,並使用@Html.EditorFor(model => model.EducationalHistories)@Html.EditorFor(model => model.ProfessionalExperiences)

+0

好的,我製作了我的編輯器模板。我用foreach來遍歷子集合的列表。我做對了嗎? –

+0

你根本不需要foreach。讓MVC處理迭代併爲其解決正確的模板。 –

+0

我沒有嘗試只是使用包含的類他爲IEnumerable編輯器模板(即使在我的意思是顯示模板),但有一個錯誤,說我試圖傳遞一個集合到視圖,只處理只是類。 我忘了提及我的孩子集合設置爲虛擬。我是否應該刪除那些爲父實體的成員禁用延遲加載? –