2009-02-27 6 views
2

オブジェクトを受け取るASP.NET MVCアプリケーションでフォームを設計しています。フォームから来るLINQモデルを更新する最良の方法

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(int id, Person person) 
    { 
     peopleService.SavePerson(person); 
     return Redirect("~/People/Index"); 
    } 

サービスでSavePersonコールがこのん:リポジトリ内

public void SavePerson(Person person) 
    { 
     _peopleRepository.SavePerson(person); 
    } 

そしてSavePersonコールがこれを行う:

public void SavePerson(Person person) 
    { 
     using (var dc = new SIGAPDataContext()) 
     { 
      if (person.IsNew) 
      { 
       dc.People.InsertOnSubmit(person); 
      } 
      else 
      { 
       dc.People.Attach(person, true); 
      } 

      dc.SubmitChanges(); 
     } 
    } 

ここでは、一般的な編集アクションは次のようになります。これは、新しいレコードを作成するときにうまく機能します。しかし、すべてのフォーム要素がなくても更新すると、他のフィールドはnullになります。たとえば、私のPersonモデルには、編集フォームに表示されていない場合はNULL値を持つNationalityIDプロパティがあります。

フォームからのフィールドのみでモデルを更新するにはどうすればよいですか?

Person persistedPerson = peopleService.GetPerson(person.ID); 
persistedPerson.Name = person.Name; 
persistedPerson.DateOfBirth = person.DateOfBirth 
// etc... 

それともこれを行うには、他の、きれいな方法があります:私は、最初のデータベースからレコードを取得し、それを手動などのプロパティです更新する必要がありますか?

答えて

1

コントローラでは、既存の人物をリポジトリから取得し、UpdateModel/TryUpdateModelを使用して、更新するプロパティのホワイトリストを渡します。これは、コントローラ上のValueProviderを使用するため、アクションパラメータリストでPersonオブジェクトを取る必要はありません。

+0

ここでは、フォームのネストされたエンティティを操作するためにUpdateModelを使用する方法のみが必要です。どうもありがとう! – changelog

+0

必要に応じて、別のホワイトリストと接頭辞を使用してサブモデルとして更新します。 – tvanfosson

+0

この質問への私の答えを見てください:http://stackoverflow.com/questions/594412/model-binding-of-nested-properties-in-asp-net-mvc/594458#594458 – tvanfosson

2

Stephen WaltherがASP.NET MVCにan article describing this very thingと投稿しました。実際には、LINQ to SQLの上に独自のDTOとビジネスオブジェクトのセットを作成し、gross complexities introduced by managing the DataContextによってlanguage-integrated object databaseとしてLINQを処理することをお勧めします。Pro LINQによれば、できるだけ生き生きしないように設計してください。

LINQ to SQLエンティティをDTOとして使用する場合は、まずエンティティを取得し、デタッチし、更新し、再度添付してから提出する必要があります。

関連する問題