2012-05-31 4 views
8

최근에 MVC를 사용하기 시작했고 거의 실망하지 않았습니다. 나를 돕는 대신, 프레임 워크가 제 방식으로 들어가고 있습니다. 모델 바인딩을 제어하는 ​​방법은 무엇입니까?

나는

ActionResult Save(long id, string whichForm) 
{ 
    if (whichForm == "A") 
    { 
     var vm = CreateModel(Request.Form); 
     if (!TryValidate(vm)) 
      return View(vm); 
     else 
      return RedirectToRoute("Success"); 
    } 
    else .... 
} 

은 기본적으로 내보기 - 모델이 구축 될 때 그것의 유효성을 검사 할 때 제어 할 수 싶습니다이 (의사 코드)와 같은 컨트롤러 액션을 작성하는 것을 시도하고있다. 이것이 가능한가? CreateModel 메서드는 어떻게 구현할 수 있습니까? 이 컨트롤러 동작 내에서 여러 가지 다른 뷰 모델을 생성 할 수 있습니다.

* Rant : 뷰 모델 바인딩과 유효성 검사가 DefaultModelBinder에서 함께 혼합 된 이유를 알 수 없습니다. 코드 냄새 같아. 특히이 동작을 재정의하기 어려운 경우.

+1

downvotes, 주셔서 감사합니다. :-) – Kugel

+0

+1 아마도 그들은 당신의 * Rant가 마음에 들지 않았지만 당신의 견해에 대한 자격이 있고 나는이 질문에 아무런 문제가 없음을 알 수 있습니다. 질문의 결과가 좋은 대답 인 경우 문제는 IMO입니다. – AaronLS

답변

16

당신이 작성하고 재량에 따라 기존 모델에 바인딩 할 수 있습니다 :

public ActionResult Save(long id, string whichForm) 
{ 
    if (whichForm == "A") 
    { 
     var vm = new FormAViewModel(); 

     if (!TryUpdateModel(vm)) 
      return View(vm); 
     else 
      return RedirectToRoute("Success"); 
    } 
    // else .... 
} 

You also have the option of creating your own IModelBinder, 당신은 바인딩 과정을 완벽하게 제어합니다. 기본 모델 바인더를 대체하거나 특정 유형에 특정 IModelBinder 구현을 등록 할 수 있습니다. 그러나 바인딩 논리가 단순하지 않으면 DefaultModelBinder에서 사용자 정의 모델 바인더를 파생시키고 싶지 않은 부분을 무시하는 것이 좋습니다.

나는 트롤과 같은 코멘트를 남기는 것을 싫어하지만 프레임 워크가 제대로 작동하지 않는다고 느낀 이유는 10 가지 중에 9 가지입니다. 왜냐하면 그들은 제대로 사용하는 방법을 아직 이해하지 못하기 때문입니다. Here is an article with general tips on model binding.

그러나 rant : Validation과 Binding은 별개이지만 기본 모델 바인더는 유효성 검사를 트리거합니다. 그 이유는 응용 프로그램이 바인딩이 자동으로 실패하거나 예외를 throw하는 것을 허용하기보다는 누락 된/잘못된/불완전한 값에 바인딩하는 문제를 정상적으로 처리 할 수있게하기 위해서입니다.

+0

정말 고마워, 나는 완전히 TryUpdateModel 메서드를 놓쳤다. 그리고 나는 꽤 오랫동안 검색해 왔으며 DefaultModelBinder와 IModelBinder에 대해 모두 읽었습니다. 또한 MVC 소스 코드를 통해 보았다 ... – Kugel

0

IModelBinder 인터페이스를 활용하고 완전한 사용자 정의 모델 바인더를 작성할 수 있습니다. 여기에 그것은 잘 설명되어 있습니다. 본질적으로이 인터페이스는 "BindModel"메서드를 노출합니다. 여기서는 유효성 검사와 함께 모델 바인딩 동작을 제어 할 수 있습니다.

http://www.dotnetcurry.com/ShowArticle.aspx?ID=584

그러나,이 문제를 복잡하게 할 수 당신은 스파게티 코드를 얻을 수 있습니다. 나는 당신에게 스위트가 있다면 간단한 "액션 모델"을 제안 할 것입니다. 그래서 다음과 같이 쓸 수 있습니다 :

+0

미안하지만, 내 질문의 요점을 놓친. – Kugel

관련 문제