2014-09-29 2 views
2

나는 결과없이 미친 듯이 인터넷 검색을하고 있었고, 아마도 정확한 키워드가 누락되었습니다.ASP.NET MVC 유효성 검사 전에보기 모델 속성을 수정하십시오.

속성에 사용자 지정 유효성 검사 특성이있는 클래스가 있습니다. 유효성 검사 전에 값을 "정리"하고 동의하는 공백과 특수 문자를 제거하지만 데이터베이스에 저장하지 않으려합니다.

public class PersonViewModel 
{ 
    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber { get; set; } 
} 

나는 이런 식으로 뭔가를 할 것이다 : 예를 1985-03-15-1234를 들어

public class PersonViewModel 
{ 
    [CleanWhiteSpace] 
    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber { get; set; } 
} 

저장하고 19850315-1234으로 검증되어야한다.

제안 사항? 가장 깔끔한 접근 방식은 무엇입니까?

+0

다음은 사용자 정의 ModelBinder가 필요합니다. – Fals

답변

2

자동 구현 속성을 수동 구현 속성으로 변경하면 값이 설정되면 "정리"단계를 수행 할 수 있으므로 모델에 "깨끗한"상태로만 저장할 수 있습니다. 다음과 같은 것이 좋습니다 :

public class PersonViewModel 
{ 
    private string _socialSecurityNumber; 

    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber 
    { 
     get { return _socialSecurityNumber; } 
     set 
     { 
      _socialSecurityNumber = CleanSocialSecurityNumber(value); 
     } 
    } 
} 
+1

나는 go필 할 때 그런 종류의 해결책을 찾았습니다. 질문에서 언급하는 것을 잊어 버렸습니다. 어쩌면 그것이 가장 깨끗한 해결책 일 것입니다. 적어도 맞춤형 모델 바인더보다 좋습니다. – Tiax

+1

이 문제를 처리 할 수있는 두 가지 방법이 있습니다. 유효성 검사를 매우 엄격하게하거나 공백을 허용하지 않거나 모델 수준에서 정리를 수행하여 유효성 검사를 느슨하게 할 수 있습니다. 모델 수준에서이 작업을 수행하는 이점은 클라이언트와 서버 측 모두에 대해 걱정할 필요가 없다는 것입니다. 서버 측만 처리하면됩니다. –

+0

저는 setter의 SSN을 지우는 정적 메소드를 가지고 있습니다. 그러나 ValdationAttribute의 값을 정리해야 작동 할 수 있습니다. 덜 이상적인 솔루션이지만 여전히 맞춤형 모델 바인더보다 좋습니다. – Tiax

2

여기서 권장되는 방법은 서비스 레이어를 사용하는 것입니다. 뷰 모델에는 로직이 포함되어서는 안됩니다. 서비스 레이어를 사용하면 컨트롤러가 관련 서비스에 대해 메서드를 호출하므로이 메서드는 깨끗한 SSN을 사용하여 뷰 모델을 반환합니다.

이 자습서에서는 서비스 계층을 구성하는 방법을 보여주고 유효성 검사 전에 데이터를 정리하기 위해 패턴을 적용 할 수 있습니다.

http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs

귀하의 예제에서 ValidationAttribute의 사용은 잘못된 사용을 할 것이다. 당신이 주입 것

컨트롤러 /이 당신에게 방향을 제공

public PersonViewModel GetPerson(int Id){ 
    // get the data (maybe from DAL) and clean returning view model 
    return new PersonViewModel(){SocialSecurityNumber = Clean(...)}; 
} 

희망 서비스 클래스

public ActionResult GetPerson(int PersonId){ 
    return _personService.GetPerson(personId); 
} 

에게 서비스 방법을 인스턴스화합니다.