0

ViewModel의 아이디어를 MVC에 넣었을 것이라고 생각하지만 업데이트 및 삭제를 수행 할 때 컨트롤러에 게시 할 수있는 고유 모델이 있어야하는 것처럼 보입니다. 기본 면도기 컨트롤러가 ViewBag을 사용하여 선택 목록을 보유하고 있음을 확인했습니다.MVC에서 게시 된 데이터를 어떻게 모델링해야합니까?

불필요한 데이터가 제거 되었기 때문에 돌아 오는 길에 ViewModel (도메인 엔티티)을 재사용 할 수 있습니다. 그러나 ViewBag에 의존하는 것처럼 보이는 모델은 Selectlist 등을 포함 할 수 있기 때문에 뷰 모델을 사용할 때는 의미가 없습니다.

제 질문은입니다. 그렇다면 별개의 "게시 된 데이터"모델을 만들기 위해 어떤 종류의 패턴이 있습니까? (Esposito의 MVC 2 책에서이 용어를 얻었습니다.) 그리고 게시 된 데이터 모델을 뷰 모델과 어떻게 관련시켜야합니까? 예를 들어, 뷰 모델을 사용하여 게시 된 데이터 모델을 포함 시키려고합니다. 나는 MVC에 익숙하지 않고 web-forms 배경에서 오는 것도 아닙니다. 컨트롤러에 전송할 데이터를 모델링하기위한 최상의 패턴을 이해하고 싶습니다.

답변

2

종종 편집/업데이트보기로 전달하고 POST 작업에서받는 것과 동일한보기 모델을 사용합니다.

public ActionResult Edit(int id) 
{ 
    DomainModel model = ... fetch the domain model given the id 
    ViewModel vm = ... map the domain model to a view model 
    return View(vm); 
} 

[HttpPost] 
public ActionResult Edit(ViewModel vm) 
{ 
    if (!ModelState.IsValid) 
    { 
     // there were validation errors => redisplay the view 
     // if you are using dropdownlists because only the selected 
     // value is sent in the POST request you might need to 
     // repopulate the property of your view model which contains 
     // the select list items 
     return View(vm); 
    } 

    DomainModel model = ... map the view model back to a domain model 
    // TODO: process the domain model 

    return RedirectToAction("Success") 
} 

지금까지 도메인 모델과 뷰 모델 간의 매핑에 관한 한 나는 당신에게 AutoMapper을 추천 할 것입니다 : 여기에 일반적으로 사용되는 패턴입니다.

+0

'ViewModel'을'DomainModel'에 매핑해야하는 이유는 무엇입니까? 왜'DomainModel'을'ViewModel' 대신 액션에 전달하지 않을까요? –

+0

@Miroprocessor, 처음 뷰 모델을이 뷰에 전달했기 때문입니다. 따라서이 뷰에는이 뷰 모델에 대한 입력 필드 만 포함됩니다. 컨트롤러 동작은보기 모델 만 뷰로 가져오고 통과해야합니다. 컨트롤러 조치를 취한 경우 DomainModel을 인수로 사용하면이 도메인 모델의 대부분의 등록 정보가 POST되지 않고 모델 바인더가이를 해결할 방법을 알지 못해 null이됩니다. –

+0

@ 다린, 빠른 답장을 보내 주셔서 감사합니다. 내가 보여준 패턴이 지금까지 가장 많이 들었던 패턴 인 것 같습니다. 뷰 모델에 포함될 수있는 ControllerModel을 만든 경우 컨트롤러를 실제로 단순화하는 것처럼 보입니다. 그렇다면 M, V, C를 모델링했을 것입니다. 이것은 나쁜 생각입니까 아니면 비슷한 것을 시도해 보셨습니까? 다시 한번 감사드립니다. – Benjamin

관련 문제