5

私はEntity Frameworkのコードファーストを使用してマッピングされ、このクラスがあります:ASP.NET MVC 3を使用して、だから、ASP.NET MVC 3 1対多のフォーム

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; } 
} 

を、どのように私は編集ビューを実行することができますPersonは1つのフォーム内の住所内のすべてのPersonプロパティを満たすことができますか?

@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を使用します。しかし、1つのアドレスしか編集していないので、Personプロパティとの別の Addressプロパティを持つ新しいViewModelクラスが簡単になるか、このビューに関連するPersonとAddressのプロパティを含むクラスを使用します。

私はSeparation of Concernsの大きな支持者です。アプリケーションには論理的に3つのモデルがあります。データベース内のデータストレージの実装を記述するEntityモデル、UI内のデータ表現の実装を記述するViewモデル、およびアプリケーション内のデータの論理表現であるDomainモデルが含まれます。ここでやっているように、目的ごとに同じモデルを使用することが魅力的です。しかし、あなたの要件が軽くなるとすぐに、それは負担になるので、必要な場所で最も効果的なクラスを作成するほうがよいです。

関連する問題