2011-08-18 5 views
13

저는 Entity Framework에 발을 들여 놓았습니다. 모델 바인딩없이 모델 상태를 검사 할 수있는 방법이 있는지 궁금합니다.모델 바인딩없이 modelstate를 확인할 수 있습니까?

주로 코드에서 사용자를 생성한다고 말하면 업데이트하기 전에 미리 정의 된 데이터 주석에 따라 유효한지 확인하는 방법이 있습니까?

public ActionResult Index() 
    { 
     User u = new User(); 
     u.Username = "test"; 
     u.Password = "test"; 
     u.Email = "test"; 

     DefaultContext db = new DefaultContext();    

     if (ModelState.IsValid) 
     { 
      db.Users.Add(u); 
      db.SaveChanges(); 
      Response.Write(u.Id); 
     } 
     else 
      // model is not valid 

     return View(); 
    } 

위의 코드는 바인딩이 발생하지 않기 때문에 작동하지 않습니다. 아니면 그 과정을 혼란스럽게 생각할 수도 있습니다.

감사합니다.

답변

17

ModelState는 모델 바인더에 의해 설정되었으므로 사용할 수 없습니다. ModelBinder는 모델을 바인딩하지 않았으므로 유효성 검사를 실행하지 않으므로 ModelState는 비어 있습니다.

하지만 그렇다고해서 속성을 사용하고 유효성 검사를 수행하는 것을 방해하지는 않습니다.

DataAnnotation 특성을 사용한다고 가정하면 모델 바인딩없이 유효성 검사를 실행할 수 있습니다. 이 클래스 감안할 때

:

public class Widget 
{ 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public decimal Price { get; set; } 
} 

당신은이 작업을 수행 할 수는 :

 var widget = new Widget 
         { 
          Id = 12, 
          Price = 15.57M 
         }; 

     var context = new ValidationContext(widget, null, null); 
     var results = new List<ValidationResult>(); 
     if(Validator.TryValidateObject(widget, context, results, true)) 
     { 
      //Validation Successful 
     } 
     else 
     { 
      //Validation Failed 
     } 

은 Name 속성이 설정되지 않았고 TryValidateObject()는 실패합니다. 결과 콜렉션에는 실제 오류가 발생합니다.

+1

내가 뭔가 새로운 내가 여기 올 때마다 배울 수 있습니다. ValidateModel() 함수를 알지 못했습니다 - ASP.Net MVC를 사용하는 경우 Jayantha의 대답도 정확하고 훨씬 쉽습니다. 내가 준 응답은 컨트롤러의 컨텍스트 외부에서 작동합니다. –

+0

위의 코드는 폼을 제출하지 않고 모델을 검증 할 때 매우 잘 작동합니다.이 경우'TryValidateModel'은 실패합니다 :'모델이 유효성 검사 중일 때 적어도 하나의 양식 입력이 모델에 바인드 된 경우 모든 특성의 모든 유효성 검사기가 실행됩니다 속성 .' 여기에서 : https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryvalidatemodel(v=vs.118).aspx – Alex

10

당신은 TryValidateModel 또는 ValidateModel

User u = new User(); 
    u.Username = "test"; 
    u.Password = "test"; 
    u.Email = "test"; 


    if (TryValidateModel(u)) 
    { 

    }else{ 

    } 
관련 문제