2010-05-25 2 views
1

유효성을 검사해야하는 상당히 복잡한 모델이 있는데,이 모델은 고객을 등록한 곳과 주소를 추가 한 곳이 다른 두 곳에서 사용된다는 것이 문제입니다. 주소의 일부 필드는 고객 등록 양식에 표시되지 않습니다. 그래서 ModelState.IsValid가 거짓인지를 확인합니다. 예를 들어. 청구서 수신 주소에는 이름이 입력되지 않지만 고객에게는 청구서 수신 주소가 표시됩니다. 그래서 유효성 검사가 발생하기 전에 모델에 몇 개의 필드를 복사 한 다음 유효성을 검사하기를 원합니다. 나는 다소 잃어 버렸고 도움이 필요하다.유효성을 검증하기 전에 특성을 복사해야 함

내 행동은 다음과 같이 보입니다 :

public ActionResult Register(WebCustomer customer) 
{ 
    customer.CopyProperties(); 
    if(TryUpdateModel(customer)) 
    { 
     ... 
    } 
    ... 

를하지만 항상 false를 반환하고 ModelState.IsValid 거짓되고 있습니다.

+1

farily = 상당히 또는 진실합니까? –

답변

3

나는이 상황에서 가장 좋은 방법은, CustomModelBinder을 작성하고, 액션의 매개 변수에 적용 할 수 있다고 생각

public ActionResult Register([ModelBinder(typeof(WebCustomerRegisterBinder))]WebCustomer customer) 
{ 
    if(TryUpdateModel(customer)) 
    { 
    ... 
    } 
    ... 
} 

복사 필드를 돌봐, 그 행동의 매개 변수에 적용하기 때문에해야이 CustomModelBinder 그 이 작업에만 사용됩니다.

+0

하지만 양식에서 게시 된 모든 값을 검색하는 방법은 무엇입니까? –

+0

TryUpdateModel()은 양식에서 고객 객체로 값을 넣으려고 시도합니다 (여기서 잘못 될 수있는 유일한 것은 TryUpdateModel이 누락 된 필드를 null로 설정하고 결과가 모델 유효성 검사에 실패한 것입니다). – tpeczek

+0

CopyProperties의 모든 기능은 Name과 같은 속성을 사용하고 Name의 주소 속성에 복사하므로 Name이 null 인 경우 나머지를 알아낼 수 있습니다. –

1

바인더가 양식 값을 처리하고 있습니다. 따라서 ModelState에서 항상 오류가 발생합니다. 당신은 귀하의 엔티티에서 귀하의 속성을 확인하거나 두 번째 옵션의 자신의 모델 바인더를 작성해야합니다. 예.

public class Customer 
{ 
    public bool IsValid() 
    { 
     //TODO: check properties. 
    } 
} 

public ActionResult Register(WebCustomer customer) 
{ 
    customer.CopyProperties(); 
    TryUpdateModel(customer); 
    if (customer.IsValid()) 
    { 
     ... 
    } 
    ... 
1

나는 그것이 가장 좋은 방법은 확실하지, 조금 diffferently 그것을 해결하지만 :

먼저 나는 ModelStateDictionary 다음

public static void ResetErrors(this ModelStateDictionary modelState) 
{ 
    foreach (var error in modelState.Values.Select(m => m.Errors)) 
{ 
    error.Clear(); 
} 
} 

에 대한 확장 메서드를 만들어 내가에 다음했다 내 행동 :

ModelState.ResetErrors(); 
customer.CopyProperties(); 
ValidateModel(customer); 
관련 문제