문제

사용하기 시작할 때 xVal 클라이언트 측면 유효성 검사에는,나만 조치를 구현하는 방법이 사용되는 도메인 모델체로 뷰 모델 또는 포함된 경우에는 해당 개체의 뷰 모델에서.

이 방법은 잘 작동 시간의 대부분이지만,경우가 있을 볼 필요가 표시 및 게시물의 백만의 일부는 모델의 속성(예를 들어 사용자가 자신의 암호를 업데이트,하지만 그의 나머지 프로파일 데이터).

한(으)로 해결 방법을 숨겨진 입력 양식에 대한 각 객실은 그렇지 않으면에 존재하는 양식입니다.

분명히 최고의 연기를 만들어 주문 시점에는 포함 속성 관련 보고 채우를 통해 뷰 모델 Automapper.그것의 많은 청소기 때문에 나는 단지 전송과 관련된 데이터를 보이지만,그것은 멀리에서 완벽한 이후 반복하는 특성을 동일한 유효성 검사에 이미 존재하는 도메인 모델을 개체입니다.

최고 싶 도메인을 지정 모델을 개체의 메타 클래스를 통해 메타데이터 특성(이것은 또한 종종"라고 친구 클래스")지만,작동하지 않기 때문 xVal 던졌을 때는 메타데이터 클래스가 존재하지 않는 뷰 모델에.

가 우아한 해결 방법을 이?고려 했습니다 해킹 xVal 소스 코드,그러나 아마도 거기에 몇 가지 다른 방법을 간과하고있다.

감사합니다,

Adrian

편집: 의 도착과 함께 ASP.NET MVC2,이뿐만 아니라 관련 문제가하는 유효성 검사에 특성상,그러나 그것은 또한 적용을 편집하고 표시 특성이 있습니다.

도움이 되었습니까?

해결책

이것은 전형적인 이유는 입력한 화면해야 하지 않을 단단하게 결합하신 모델입니다.이 질문은 실제로 여기에 팝업에 MVC 태그에 대한 3-4times a month.나는 속하는 경우를 찾을 수 있 이전 질문에 일부 의견의 토론 여기에 흥미롭습니다.;)

문의 데이려는 힘을 두 가지 검증 컨텍스트의 모델로 하나의 모델이 실패하면 아래에서 많은 양의 시나리오.가장 좋은 예입 새로운 사용자는 다음을 갖는 관리자는 사용자를 편집장니다.를 확인해야 합니다 암호를 사용자에게 개체 등록하는 동안 하지만 당신은 보이지 않을 것이 비밀번호 필드 관리자를 편집합니다.

을 선택한 이들은 모두 sub-optimal.나는 이 문제에 대한 3 프로젝트 지금 및 구현하는 다음과 같은 솔루션을 적이있다 깨끗하고 일반적으로 실망입니다.나는 시도를 하려고할 실용적인 든 DDD/db/모델/hotnessofthemonth 토론 다른 사람들입니다.

1)다양한 보기 모델 데 viewmodels 거의 동일한 위반 건조한 주요 하지만 나는 느낌의 비용은 이 방법은 정말 낮습니다.일반적으로 위반하는 건조 amps 유지 관리 비용이지만 이럴 때 이에 대한 비용은 최저과하지 않는 많은 금액.가설적으로 말하지 않는 방식을 변경 max 번호 문자 성장할 수 있는 매우 많습니다.

2)동적인 메타데이터 가 있는 후크에서 MVC2 제공을 위해 자신의 메타데이터에 대한 모델입니다.이 방법으로 당신은 무엇이든 할 수있는 당신을 사용하여 메타데이터를 제공하기 위해 특정 제외 필드를 기반으로 현재 HTTPRequest 따라서 작업하고 컨트롤러입니다.내가 사용했던 이 기술을 구축하는 데이터베이스 구동 권한 시스템에 간 DB 말 서브 클래스의 DataAnnotationsMetadataProvider 을 제외 속성을 기반으로 값 데이터베이스에 저장됩니다.

이 기술은 작업한 atm 하지만 문제와 유효성을 검사합니다 UpdateModel().이 문제를 해결하기 위해 우리가 생성 SmartUpdateModel() 하는 방법도 간 데이터베이스에 자동으로 생성 exclude string[]배열도록 모든 비 permissisable 필드지 유효성을 검사합니다.우리는 물론 캐시이 성능 때문에 그래서 나쁘지 않다.

되풀이하려는 우리가 사용하는[ValidationAttributes]에서 우리의 모델은 다음 superceeded 으로 그들을 새로운 규칙에 runtime.최종 결과는 [Required] 사용자.성 필드지 검증하는 경우 사용자지에 액세스할 수 있는 권한이 있습니다.

3)미친 인터페이스를 동적 프록시 일 마지막 기도를 사용하는 것이었을 위한 인터페이스 ViewModels.최종 결과가 나는 사용자 객체에는 상속에서의 인터페이스 IAdminEditIUserRegistration.IAdminEdit 및 IUserRegistration 것이 모두 포함 DataAnnotation 는 특성이 수행되는 모든 상황에 맞는 특정 유효성 검사에 같은 암호 속성을 가진 인터페이스가 있습니다.

이 필요 일부는 해커들이 많은 학문적 운동입니다.문제를 2 및 3 에는 UpdateModel 및 DataAnnotationsAttribute 공급자에 필요한 주문을 받아서 만들어지기 위하여 인식할 수 있어 이 기술입니다.

내 가장 큰 걸림돌이 되었지 않았지를 보내려 온 사용자 객체를 보냈을 사용하여 동적 프록시를 만들 런타임의 인스턴스 IAdminEdit

지금 내가 이것을 이해하는 것은 매우 xVal 특정 질문은 하지만 모두 도로의 동적 유효성 검사에 다음과 같이 사용자 정의 내부 MVC 메타데이터가 공급자입니다.부터 모든 재료 메타데이터는 새로운 아무것은 깨끗하는 간단하다.작업할 사용자 지정 MVC 유효성 확인은 행동을 어렵지 않지만 필요에 깊이는 방법에 대한 지식을 모두 내부에 작동합니다.

다른 팁

검증 속성을 ViewModel 레이어로 옮겼습니다. 우리의 경우, 이것은 도메인 모델을 설계하여 처음부터 유효하지 않은 상태에 빠질 수 없었기 때문에 어쨌든 더 깨끗한 우려 사항을 제공했습니다. 예를 들어, BillingTransaction 객체에서 날짜가 필요할 수 있습니다. 그래서 우리는 그것을 무효로 만들고 싶지 않습니다. 그러나 뷰 모델에서는 사용자가 값을 입력하지 않은 상황을 포착 할 수 있도록 무효가 될 수있는 노출이 필요할 수 있습니다.

다른 경우에는 페이지/양식에 따라 특정 유효성 검사가있을 수 있으며, 사용자가 수행하려는 명령에 따라 여러 가지 물건을 설정하고 도메인 모델을 묻지 않고 "귀하는 귀하가 있습니까? "ABC"를 수행하는 데 XYZ를 수행하는 데 유효합니다. 해당 값은 유효합니다.

ViewModels가 가설 적으로 당신에게 강요되는 경우 도메인-공수 요구 사항 만 시행하는 것이 좋습니다. 여기에는 "사용자 이름이 필요합니다"및 "이메일이 제대로 형식화됩니다"와 같은 것들이 포함됩니다.

보기 모델의 도메인 모델에서 유효성 검사를 복제하면 도메인을 UI에 밀접하게 결합했습니다. 도메인 유효성 검사 변경 ( "주당 2 개의 쿠폰 만 적용 할 수있다"는 "주당 1 개의 쿠폰 만 적용 할 수있다")는 UI를 업데이트해야합니다. 일반적으로 말하면, 이것은 끔찍하고 민첩성에 해로울 것입니다.

도메인 모델에서 UI로 유효성 검사를 이동하면 도메인을 본질적으로 팅하고 유효성 검사 책임을 UI에 배치했습니다. 두 번째 UI는 모든 유효성 검사를 복제해야하며 두 개의 별도 UI를 함께 연결했습니다. 이제 고객이 iPhone에서 인벤토리를 관리하기 위해 특수 인터페이스를 원한다면 iPhone 프로젝트는 웹 사이트 UI에있는 모든 유효성 검사를 복제해야합니다. 이것은 위에서 설명한 유효성 검사 복제보다 훨씬 끔찍합니다.

미래를 예측할 수 있고 이러한 가능성을 배제 할 수 없다면 도메인-공유 요구 사항 만 검증하십시오.

이것이 클라이언트 측 유효성 검사에서 어떻게 플레이할지는 모르겠지만 부분 검증이 문제 인 경우 수정할 수 있습니다. DataAnnotationsValidationRunner 여기에서 논의했습니다 IEnumerable<string> 다음과 같이 속성 이름 목록 :

public static class DataAnnotationsValidationRunner
{
     public static IEnumerable<ErrorInfo> GetErrors(object instance, IEnumerable<string> fieldsToValidate)
     {
           return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>().Where(p => fieldsToValidate.Contains(p.Name))
                  from attribute in prop.Attributes.OfType<ValidationAttribute>()
                  where !attribute.IsValid(prop.GetValue(instance))
                  select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
     }
}

나는 DownVotes를 위험에 빠뜨리고 특히 ASP.NET MVC에서 ViewModels (ASP.NET MVC)에 대한 이점이 없다고 말할 것입니다. 아이디어가 도메인에서 분리하는 것이라면, 이는 방어 할 수 없습니다. 도메인에서 분리 된 UI는 해당 도메인의 UI가 아닙니다. UI ~ 해야 하다 도메인에 의존하므로 도메인 모델에 뷰/작업이 연결되어 있거나 도메인 모델과 함께 ViewModel 관리 로직이 연결됩니다. 따라서 아키텍처 논쟁은 무시됩니다.

아이디어가 ASP.NET MVC의 모델 바인딩을 돌연변이 필드에 활용하는 악의적 인 HTTP 게시물을 해킹하지 못하도록하는 경우, 변경을 허용하지 않아야하는 경우 a) 도메인은이 요구 사항을 시행해야하며 b) 조치가 있어야합니다. 모델 바인더에 업데이트 가능한 속성의 화이트리스트를 제공합니다.

도메인이 엔티티 사본 대신 라이브 인 메모리 객체 그래프와 같은 미친 것을 드러내지 않는 한, 뷰 모델은 낭비 된 노력입니다. 질문에 답하기 위해 도메인 모델에서 도메인 검증을 유지하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top