5

我有這個班是誰在使用實體框架代碼優先映射:ASP.NET MVC 3一到多格式

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    //... additional properties 
    [Required] 
    public virtual ICollection<Address> Addresses { get; set; } 
} 
public class Address 
{ 
    public int AddressId { get; set; } 
    public string Street { get; set; } 
    //... additional properties 

    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 

因此,使用ASP.NET MVC 3,我怎麼能進行編輯視圖人只需在一張表格中填寫地址內的所有人物?

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Adresses.FirstOrDefault().Street) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Adresses.FirstOrDefault().Street) 
      @Html.ValidationMessageFor(model => model.Adresses.FirstOrDefault().Street) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

這工作正常,顯示街道從數據庫輸入,但是當我提交時,街道不會改變。

[HttpPost] 
public ActionResult Edit(int id, FormCollection formCollection) 
{ 
    Person person = unityOfWork.PersonRepository.GetById(id); 

    UpdateModel<Person>(person); 

    if (ModelState.IsValid) 
    { 
     unityOfWork.PersonRepository.Update(person); 
     unityOfWork.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(person); 
} 

回答

3

由於模型聯編程序必須修復收集的方式,因爲相關的ID不存在,所以會很困難。

最好爲此屏幕創建一個ViewModel並在它和底層域模型之間進行轉換。

如果您提供編輯所有地址的工具,我會使用Steve Sanderson's BeginCollectionItem helper。但是由於您只編輯一個地址,所以帶有Person屬性和單獨的地址屬性的新ViewModel類會更容易一些,或者使用包含Person和Address中與此視圖相關的屬性的類。

我是分離關注的大支持者。在您的應用程序中邏輯上有三種模式;描述數據庫中數據存儲實現的實體模型,描述UI中數據表示實現的View模型以及應用程序中數據邏輯表示的Domain模型。如你在這裏所做的那樣,爲每個目的使用相同的模型是很有誘惑力的。但只要你的要求變得毫無意義,它就成爲一種負擔,所以你最好創建在你需要它們的地方最好地工作的類。