2013-03-20 7 views
0

:모델 바인딩 유효성 검사 오류 내 사용자 정의 모델 검증에서

public ActionResult Update([ModelBinder(typeof(ModelBinder.ContactModelBinder))] USR.USRContact contact) 
    { 
     if (ModelState.IsValid) 
     { 
      repository.Update(); 
      return View("~/Views/Shared/Contacts/ShowContactInfo.cshtml", repository.GetContactByID(contact.ContactID)); 
     } 
} 

}

:

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){ 
     var repository = DependencyResolver.Current.GetService(typeof(IContactRepository)); 
     IContactRepository repo = repository as IContactRepository; 
     USRContact c = repo.GetContactByID(Convert.ToInt64(bindingContext.ValueProvider.GetValue("ContactID").AttemptedValue)); 
     c.FormalName = bindingContext.ValueProvider.GetValue("FormalName").AttemptedValue; 

     if (!repo.IsValidFormalName(c.ContactID, c.FormalName)) 
     { 
      var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

      bindingContext.ModelState.AddModelError("FormalName", Resources.ErrorMsgs.FormalNameNotUnique); 

      return bindingContext.Model; 
     } 

     c.PreferredName = bindingContext.ValueProvider.GetValue("PreferredName").AttemptedValue; 
     c.Alias = bindingContext.ValueProvider.GetValue("Alias").AttemptedValue; 
     c.Pseudonym = bindingContext.ValueProvider.GetValue("Pseudonym").AttemptedValue; 
     c.GenderID = Convert.ToInt32(bindingContext.ValueProvider.GetValue("GenderID").AttemptedValue); 
     c.NationalityID = Convert.ToInt32(bindingContext.ValueProvider.GetValue("NationalityID").AttemptedValue); 
     c.ModifiedByID = Utilities.SessionUtil.Current.UserID; 
     c.ModifiedDate = DateTime.Now; 

}

내 컨트롤러는 다음을 수행하여이 모델 바인더를 호출

내 viewmodel에는 공식적인 이름이 필요하며 그 외에도 alia s는 60 자 미만이어야합니다. 모델 바인더가 영구 데이터 모델 (USRContact)로 변환하고 뷰에서 뷰 모델을 예상하는 경우 오류를 어떻게 표시합니까?

뷰 모델의 유효성 검사 오류에서 컨트롤러가 영구 데이터 모델로 변환되지 않도록하는 방법이 있습니까? 데이터 객체의 모든 모델 오류를 검사하고 유효성 검사 오류를 찾더라도 오류가있는 텍스트 상자 옆에있는 오류가있는 방금 사용자에게 다시 보냅니다.

도움 주셔서 감사합니다! Safris

답변

0

난 당신이 직면 한 문제는 사용자 정의 바인더를 통해 다른 객체에 값을 입력하면 더 이상 페이지에 있던 것과 동일하지 않다는 것입니다.

Html.ValidationFor (x => x.PropertyValue)와 함께 "PropertyValue"라는 속성이 PropertyValue가있는 항목의 ModelState 오류 컬렉션을 조사합니다.

일단 연락처로 푸시했다면 Contact 값은 Contact.PropertyValue가됩니다. 당신이 다음을 검증 경우는이 단지 Html.ValidationFor (X => x.Contact.PropertyValue)에 의해 선택 될 것 "Contact.PropertyValue"로 ModelState에 추가됩니다

가장 쉬운 해결책이 있는지 확인하는 것입니다 당신의 입력과 출력은 같은 구조를 따릅니다. 항목을 Html.TextBoxFor (x => x.Contact.SomeProperty)로 렌더링 할 수 있다면 문제가 없습니다.