2009-02-27 8 views
2

개체를받을 ASP.NET MVC 응용 프로그램에서 양식을 디자인하고 있습니다. 이제양식에서 오는 LINQ 모델을 업데이트하는 가장 좋은 방법

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

을 :

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

그리고 저장소의 SavePerson 호출이 수행합니다

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

서비스의 SavePerson 호출이이 작업을 수행 : 여기에 일반적인 편집 작업이 생겼는지 , 이것은 새 레코드를 만들 때 잘 작동합니다. 그러나 모든 양식 요소없이 업데이트하면 다른 필드가 null입니다. 예를 들어, 내 Person 모델은 편집 양식에 표시되지 않는 경우 Nulled 인 NationalityID 특성을가집니다.

양식에서 가져온 필드만으로 모델을 업데이트하는 것이 가장 좋은 방법은 무엇입니까?

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

또는이 작업을 수행하는 다른, 청소기 방법이 : 내가 먼저 데이터베이스에서 레코드를 가져과 같이 수동 등록의 갱신해야합니까?

답변

1

컨트롤러에서 기존 사람을 리포지토리에서 검색 한 다음 UpdateModel/TryUpdateModel을 사용하고 업데이트 할 속성의 허용 목록을 전달하십시오. 이렇게하면 컨트롤러에서 ValueProvider를 사용하므로 Action 매개 변수 목록에서 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로 사용하려는 경우 엔티티를 먼저 가져 와서 분리하고 업데이트하고 다시 첨부 한 다음 제출해야합니다.

관련 문제