2009-07-06 5 views
24

저는 첫 번째 .NET MVC 응용 프로그램을 만들고 NerdDinner 튜토리얼을 참조 점으로 사용하고 있습니다. 현재 흥미로운 점은 UpdateModel()입니다. (난 정말 이해가 안 가지를 사용하여 좋아하지 않는다.)ASP.NET MVC UpdateModel() 메서드는 어떻게 작동합니까?

NerdDinner tutorial에서 촬영 -

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    UpdateModel(dinner); 

    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = dinner.DinnerID }); 
} 

내 주요 상담자 UpdateModel() 편집 방법에 전달 된 formValues에 접근 않는 방법입니다 ? 컬렉션이 명시 적으로 메서드의 매개 변수로 전달되지 않는 이유는 무엇입니까?

+0

Microsoft의 [ASP.NET MVC 소스] (http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en)를 사용하고 다음을 사용하십시오. 코드를 단계별로 살펴 보겠습니다. 그러면 그들이 정확히 어떤 마술을하는지 알 수 있습니다 : – mkchandler

+0

양식 수집 시나리오 또는 다른 용도로만 작동합니까? – Krish

답변

3

양식, 검색어 문자열, 쿠키 및 서버 변수와 같은 모든 HttpRequest 입력을 검사합니다. 나는이 순서대로 생각한다.

+0

'UpdateModel Function'은 양식 수집 시나리오에서만 작동합니까? – Krish

24

UpdateModel()은 다양한 입력 데이터 소스 (View, QueryString 값, 세션 변수/쿠키 등의 HTTP POST 데이터)를 지정한 명시 적 모델 객체에 바인드하려고하는 Controller helper 메소드입니다 매개 변수로. 기본적으로 모델 바인딩에만 사용됩니다.

보기 모델과 같이 강력한 형식의 모델로 작업에 대한 입력 매개 변수를 표현하면 UpdateModel()이 호출 될 때 장면 뒤에서 수행 된 모든 단계를 이미 완료 한 것입니다. DataContext에서 객체를 가져 와서 속성을 편집하면 SaveChanges()만이 업데이트를 데이터베이스 (이 경우 Save())로 다시 푸시하는 데 필요한 것입니다.

예 :

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    dinner.Description = incoming.Description; 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

그러나, 강력한 형식의 모델 UpdateModel()를 사용하기위한 사용 사례가있다 : 당신은 그것의 가치를 강력한 형식의 모델에서 전달하고 싶은 경우 엔티티의 엔티티를 데이터베이스에서 직접 바꿉니다 (이름이 모두 동일하고 입력 된 경우). 이 경우 개체를 검색하여 UpdateModel()을 사용하면 해당 모델 바인딩 작업에서 비슷하게 이름이 지정된 형식화 된 속성을 강력한 형식의 개체에서 검색된 개체로 가져옵니다. 즉, 반사을 수행합니다.

귀하의 예와 같이 업데이트 할 항목을 지정하지 않고 모든 속성을 업데이트하고 강력한 형식의 모델과 데이터베이스 모델의 이름이 비슷한 속성이있는 경우 UpdateModel()을 사용하여 반사의.

예 :

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    UpdateModel(dinner); 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

여기 (A FormCollection 개체를 사용하여 이상) 유일한 장점은 (incoming.DinnerID 같이)는 강력한 형식의 객체의 다른 모든 속성에 액세스 할 수있는 것이다.

결론 : 강력한 형식의 개체를 파생 된 개체로 변환하는 경우 UpdateModel()을 사용하는 것이 가장 쉽습니다. 그러나 파생 된 객체의 몇 가지 속성을 단순히 업데이트하는 경우에는 거의 필요하지 않습니다. 또한 Entity Framework (Linq to SQL과 같은 것 대신)를 사용하면 강력하게 형식화 된 객체와 파생 객체를 고유 한 메서드와 관련시킬 수 있으므로 이러한 모든 사항을 고려해야합니다.

+0

'UpdateModel Function'은 폼 콜렉션 시나리오 또는 다른 것들에 대해서만 작동할까요? – Krish

관련 문제