2010-12-31 8 views
4

POCO를 사용하여 EF4로 MVC3 응용 프로그램을 만들고 있습니다. EF 엔티티에 유효성 검사 속성을 추가했습니다. 이제 뷰를 빌드 할 때 뷰 모델을 사용하고 싶습니다 (아마도 채우기 위해 AutoMapper을 사용합니다).MVC, ViewModels 및 유효성 검사

내가 만난 문제는 DRY 보안 주체를 위반하는 뷰 모델에서 유효성 검사 속성을 재정의해야한다는 것입니다. 예를 들어 필드의 크기를 변경하기로 결정한 경우이를 사용하는 POCO 및 모든보기 모델에서 MaxLength 특성을 변경해야합니다.

내 POCO의 유효성 검사 규칙을 내보기 모델에 매핑 할 수있는 까다로운 방법이 있습니까?

답변

1

너무 어려워서 DRY를 위반하는 데 동의합니다. 이 Here에 관한 최근 질문을 올렸으며 꽤 많은 푸시 백을 받았습니다.

실제 응용 프로그램에서 완벽한 DRY를 얻을 수는 없습니다. 때때로 당신은 맹목적으로 그것에 충실하려고 노력하는 것보다 원칙을 어기는 것이 더 낫습니다.

편집 :

하나 또한 단일 책임 원칙 (SRP)을 위반 할 수 DRY을 고려할 수 있습니다. 비슷한 코드를 재사용함으로써 코드가 두 가지 이상을 수행하게되었습니다. 데이터 모델과 뷰 모델의 목적이 다르기 때문에 책임이 다르다는 사실을 생각하면 단일 모델로 결합하면 SRP를 위반하게됩니다. 즉, 데이터 모델을 뷰 모델로 만들면 두 가지 책임이 달라집니다.

SRP를 DRY로 잠재적으로 시도하고 조정할 수있는 여러 가지 방법을 생각해 볼 수는 있지만 비용 측면에서 이점을 고려해야합니다.

+0

응답 해 주셔서 감사합니다. JQuery 유효성 검사를위한 유효성 검사 속성을 재사용 할 수있는 영리한 방법이 필요하다고 생각하고 있습니다. 컨트롤러에서 유효성 검사가 너무 중요하지 않으므로 엔티티 개체가 문제가되지 않습니다.하지만 지금은 - 원하는 속성을 구현하십시오. – Brian

5

개인적으로 뷰 모델에서 유효성 검사를 수행합니다. 이것은 컨트롤러가 뷰로부터받는 것이며 사용자 입력을 포함하는 클래스입니다. 유효성 검사 규칙에는 표면 유효성 검사와 비즈니스 유효성 검사의 두 가지 유형이 있습니다. 필수 필드와 같은 규칙, 뷰 모델에서는 적절한 형식을 적용해야하며 주어진 이름을 가진 사용자와 같은 비즈니스 규칙은 데이터베이스에 이미 존재해야하며 모델에서 유효성을 검사해야합니다.

동일한 모델에 매핑 된 다른보기 모델을 가질 수도 있지만보기 유효성 검사 규칙에 따라 달라질 수 있습니다. 이 때문에 뷰 모델에 대해 정확히 동일한 유효성 검사 규칙이 적용되지 않습니다.

2

일부 추상화를 얻는 한 가지 방법은 필요한 다른보기 정보를 포함하여 비즈니스 모델 클래스로 구성된 'ViewModel'을 만드는 것입니다.

class MyObject 
{ 
    public int ID {get;set} 

    [Required] 
    [StringLength(512)]  
    public string Name {get;set;} 

} 

class MyViewModel // ViewModel for a specific view 
{ 
    public MyObject MyModel {get;set;}  // the model that is being edited 

    // other data the view might need, set by the controller 
    public string SomeMessage { get; set; } 
    public List<SomeObject> SomeObjects {get;set;} /// e.g. for a drop-down list 

} 

그런 다음보기에서 그에 따라 ViewModel을 참조하십시오.

@model My.Namespace.MyViewModel 


Hello @model.MyModel.Name !!! 

이렇게하면 한 곳에서 비즈니스 클래스의 유효성 검사 및/또는 데이터 주석 만 지정할 수 있습니다.

다른 유효성 검사를 원한다면 유효성 검사 논리를 선택적으로 적용하는 전략이 필요합니다.