2012-09-26 2 views
1

컨트롤러 메서드 호출 중에는 어떻게됩니까? 컨트롤러의 모든 PUBLIC 메서드에 대해 MVC가 ModelState를 평가/설정합니까? 메서드 매개 변수에서 모든 클래스를 테스트합니까 ??MVC 컨트롤러 작업 및 ModelState.IsValid 발생합니다.

public ActionResult Create(Entity myEntity, AnotherEntity, myEntity2) 
{ 
    if (ModelState.IsValid) 
    { 

내가 ActionResult 대 INT의 반환 한 경우 :

public int Create(Entity myEntity, AnotherEntity, myEntity2) 
{ 
    if (ModelState.IsValid) 
    { 

여전히 평가 클래스와 ModelState있을 것를?

답변

2

실제로 컨트롤러가 아닙니다. 그것은 모델 바인더입니다. 모델 바인더의 책임은 요청 값이 주어진 해당 모델을 인스턴스화하는 것입니다. 첫 번째 단계는 모델 바인딩이고 두 번째 단계는 유효성 검사입니다. 첫 번째 단계는 모델 바인더로 수행됩니다. 이 단계에서 오류가 발생하면 (예 : 모델의 정수 필드를 사용자가 임의의 텍스트를 입력 한 입력 텍스트에 바인딩하려고 시도한 경우) 모델 바인더는 모델 상태에 오류를 자동으로 추가하므로 당신이 ModelState.IsValid 여부를 테스트 할 수있는 컨트롤러 작업을 입력하십시오.

모델 바인딩이 성공하면 모델의 인스턴스가 이제 해당 유효성 검사 프레임 워크로 전달됩니다. 따라서 예를 들어 데이터 주석을 사용하고 유효성 검사 속성으로 모델 특성을 장식 한 경우 평가가 수행되고 오류가 있으면 ModelState에 자동으로 추가됩니다.

나는 ActionResult 대 INT의 반환 한 경우 :

당신은 모든 컨트롤러 액션이 ActionResult를 반환해야 ASP.NET MVC 표준 규칙을 위반하는 것입니다. 하지만 반환 유형은 입력 매개 변수의 모델 바인딩 및 유효성 검사와는 아무런 관련이 없습니다. 리턴 타입은 가능한 ActionResult 파생 클래스 또는 사용자 정의 클래스 중 하나 일 수 있습니다.

예를 들어, 모델의 HTML 표현을 렌더링하려는 경우 ViewResult을 반환합니다. 모델의 JSON 표현을 반환하려면 JsonResult을 반환합니다. 정적 문자열을 반환하려면 ContentResult을 반환합니다. 사용자가 파일을 다운로드하도록 허용하려면 FileResult을 반환하십시오. 등등.

+0

모델 바인더라고 알고 있습니다. 내가 모르는 것은 모델 바인더가 호출되는 시점과 호출되는 시점입니다. 메서드가 호출 될 때 모델 바인더가 컨트롤러의 모든 public 메서드에 대해 자동으로 호출됩니다. 아니면 ActionResults에 대해서만이 작업을 수행합니까? 모델 바인더는 메서드 매개 변수의 모든 클래스를보고 모든 오류를 ModelState에 합산합니다. – user965445

+0

작업이 호출되기 전에 모델 바인더가 호출됩니다. 요청에서 모든 값을 검색하고 모델을 인스턴스화하고 값을 구문 분석하여 특성을 설정하는 것은 모델 바인더의 책임입니다. 이 작업이 모두 끝나면 컨트롤러 작업이 호출되어 모델 바인더로 만든 모델을 전달합니다. –

관련 문제