2010-05-21 6 views
2

안녕하세요, 간단한 질문이 있어야합니다. System.CompontentModel.DataAnnotations를 사용하는 일련의 유효성 검사가 있습니다. MVC2와 함께 제공되는 기본 AccountModels.cs 파일 에서처럼 특정 뷰 모델에만 적용되는 유효성 검사가 있으므로 모델과 동일한 파일에 유효성 검사 코드가있는 것이 좋습니다. 그러나 여러 모델에 적용되는 몇 가지 일반적인 유효성 검사가 있습니다 (예 : 유효한 전자 메일 주소 형식). 필자가 필요로하는 두 번째 모델에 해당 유효성 검사를 잘라내거나 붙여 넣을 때 동일한 네임 스페이스 (projectName.Models)에 있으므로 중복 정의 오류가 발생합니다. 그래서 공통된 유효성 검사를 네임 스페이스 내 별도의 클래스로 제거하여 모든 뷰 모델이 거기에서 유효성 검사에 액세스 할 수있을 것으로 기대했습니다. 예기치 않게 인증에 더 이상 액세스 할 수 없습니다. 나는 그들이 여전히 같은 네임 스페이스에 있다는 것을 확인했으며, 모두 공개이다. 내가 그들에 대한 특정 참조 (같은 네임 스페이스에 대한 문을 사용하여 추가했지만 그걸 해결하지 못했고, 참조 추가 대화 상자를 통해 프로젝트 자체를 참조 할 수 없다는 것을 기대하지 않을 것이다. 의미).ASP.Net MVC2의 공통 DataAnnotations

그래서 단순히 같은 공간에서 다른 파일로 이동 한 공개 검증이 여기에? 내 모델에 표시되지 않습니다

CommonValidations.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Text.RegularExpressions; 

namespace ProjectName.Models 
{ 
    public class CommonValidations 
    { 
     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true, Inherited = true)] 
     public sealed class EmailFormatValidAttribute : ValidationAttribute 
     { 
      public override bool IsValid(object value) 
      { 
       if (value != null) 
       { 
        var expression = @"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$"; 
        return Regex.IsMatch(value.ToString(), expression); 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
    } 
} 

을 왜 어떤 아이디어 년대 유효성 검사를 사용하려는 코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using Growums.Models; 

namespace ProjectName.Models 
{ 
    public class PrivacyModel 
    { 
     [Required(ErrorMessage="Required")] 
     [EmailFormatValid(ErrorMessage="Invalid Email")] 
     public string Email { get; set; } 
    } 
} 
+0

Visual Studio에서 사용자의 특성을 인식하지 못합니까? 또는 컴파일이 실패합니까? 또는 런타임 오류가 발생합니까? –

+0

컴파일이 실패합니다. 공통 유효성 검증 파일에 정의 된 유효성 검증을 인식하지 못합니다. 동일한 네임 스페이스에 있습니다. –

답변

1

EmailFormatValidAttribute를 CommonValidations의 서브 클래스로 선언했습니다. 따라서 CommonValidations.EmailFormatValidAttribute와 같이 참조해야합니다. 또는 EmailFormatValidAttribute 클래스를 CommonValidations 클래스 외부로 이동합니다.

이 작동합니다 : 다음과 같은 방법으로

[CommonValidations.EmailFormatValid(ErrorMessage="Invalid Email")] 
public string Email { get; set; } 

, 당신은 당신의 클래스를 단순화 할 수 있습니다 : Data Annotations Extensions :

또한
public class EmailFormatValidAttribute : RegularExpressionAttribute 
{    
    public EmailFormatValidAttribute() : 
     base(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$") 
    {} 
} 

은, 이것 좀보세요. 이미 가장 일반적인 검증이 포함 된 훌륭한 DataAnnotations 라이브러리입니다.

+0

:: 한숨 :: 고마워. 잘라 내기 및 붙여 넣기를 다시 한 번 반복합니다. :) 맞습니다. VS가 저를 위해 만든 스캐 폴드 클래스에 유효성 검사 특성을 붙여 넣었습니다. 클래스를 중첩하여 (기술적으로 말하자면, CommonValidations에서 상속되지 않는 한 "서브 클래스"가 아닙니다. 당신의 요점을 얻으십시오). 저의 실수를 지적 해 주셔서 감사드립니다. –

+0

하위 클래스가 아니라 중첩 된 클래스라고도 함 : 클라이언트 측 유효성 검사를 수행하려는 경우에도 방법으로 충분하지 않은 경우 클라이언트 측 유효성 검사기가 필요합니다. –

관련 문제