2010-01-17 1 views
1

다른 검증 방법을 사용하는 것이 좋습니다. ASP.NET MVC 1.0을 사용하여 유효성 검사를 수행하기 위해 미리 만들어진 많은 옵션이없는 것 같습니다. 사람들이 말하는 핵심 내용은 xVal입니다. 그러나 문자 그대로 문서가 없습니다. 사실 창업자의 블로그에는 두 개의 게시물 만있는 것으로 보입니다.ASP.NET MVC 1.0 Validation with xVal

어쨋거나, 클라이언트 인증을 제공 할 수있는 유일한 방법입니다. 내 문제는 내가 LLBLGen을 사용하여 내 모델을 생성하고 있으며 코드를 수정하고 싶지 않기 때문에 속성 기반 물건을 사용할 수 없다는 것입니다.

xVal에 대해 읽은 모든 내용은 IRulesProvider를 구현할 가능성에 대해 이야기했지만 실제로 어떻게 사용하고 사용하는지에 대한 실제 정보는 없습니다. 나는 그것을 구현하지만 실제로 할 수없는 속성을 사용하는 코드를 발견했다.

누구든지 내 모델 클래스를 직접 코딩하지 않거나 DataAnnotations 또는 비슷한 것을 사용할 수없는 경우 xVal 사용 방법에 대한 지침을 제공 할 수 있습니다 (xVal 대신 사용할 수있는 문안이 있지만 아무 것도 보지 못했습니다. ASP.NET MVC 1.0을 고수해야하고 클라이언트 측 유효성 검사 지원이 필요합니까?

편집 : 코드를 많이 생성하므로 다른 어셈블리에있을 것이므로 부분 클래스 접근 방식이 적합하지 않다고 생각합니다.

+1

왜 부분 수업이 효과가 없는지 이해가 안됩니다. 이는 C#에서 템플릿 생성 클래스에 사용자 지정 동작을 추가하는 꽤 일반적인 접근 방식입니다. 사용자 정의 코드를 변경하지 않기 때문에 "많이"생성되는지는 중요하지 않습니다. 그리고 그들이 다른 어셈블리에있을 것이라는 것은 무엇을 의미합니까? 다른 어셈블리에서는 사용할 수없는 부분 클래스의 제한 사항입니다. 설명서를 참조하십시오. http://msdn.microsoft.com/en-us/library/wa80x488%28VS.80%29.aspx –

+0

@jacerhea, 부분 클래스가 작동하지 않는 이유는 생성 된 코드 다른 어셈블리에 있습니다. 부분 클래스가 동일한 어셈블리에 있어야한다는 것이 맞습니까? – JustAProgrammer

+0

나는 오해했다. 나는 당신이 실제로 그들이 다른 집회에 참석할 것이라고 말하고 있다고 생각했고, 불가능하다고 말하고있었습니다. 예, 부분 클래스는 동일한 어셈블리에 있어야합니다. 그것은 이상한 요구처럼 보이지만 코드의 다른 모듈에서 같은 클래스의 다른 부분을가집니다. 이러한 다른 요구 사항으로 인해 잘못된 아키텍처 결정을 내 리도록 강요 한 것으로 생각하십니까? 어쨌든, 사용자 정의 IRulesProvider를 구현하려면 xVal 소스를 다운로드하는 것이 좋습니다. 여기서 성 및 NHibernate에 대한 IRulesProvider 코드를 살펴볼 수 있습니다. –

답변

4

부분 클래스에서 MetadataType 특성을 사용하여 LLBLGen 또는 다른 ORM 생성 클래스와 함께 xVal을 사용할 수 있습니다. 당신이 UserEntity라는 LLBL 생성 된 개체가있는 경우 예를 들어, 당신은 부분 클래스를 만들 것이며이 같은 MetadataType 속성으로 마크 업 : 당신이 가진 속성을 마크 업 할 수있는

[MetadataType(typeof(UserEntityMetaData))] 
public partial class UserEntity 
{ 
} 

당신은보다 메타 클래스를 생성합니다

public class UserEntityMetaData 
{ 
    [Required()] 
    [StringLength(50)] 
    [DataType(DataType.EmailAddress)] 
    public object EmailAddress { get; set; } 
    [Required()] 
    [StringLength(32)] 
    [DataType(DataType.Password)] 
    public object Password { get; set; } 
    [Required()] 
    [StringLength(25)] 
    public object FirstName { get; set; } 
    [Required()] 
    [StringLength(25)] 
    public object LastName { get; set; } 
} 

이렇게하면 사용자 정의 부분 클래스 만 LLBL 생성 코드를 변경할 필요가 없습니다. 유일한 부분은 생성 된 엔티티 클래스와 동일한 네임 스페이스에 부분 클래스와 메타 클래스가 모두 필요하다는 것입니다. 이 작업을 수행 할 필요는 없지만 xVal 유효성 검사를 호출하면 작업이 더 쉬워집니다.

1

jcerhea에 따르면 DataAnnotationsValidationRunner 클래스가 GetErrors 메소드의 "친구"클래스를 처리하도록 설정되는 방법을 수정해야한다고 덧붙였다.

namespace Entities 
    { 
     public static class DataAnnotationsValidationRunner 
     { 
      public static IEnumerable<ErrorInfo> GetErrors(object instance) 
      { 
       var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault(); 
       var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType(); 
       var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>(); 
       var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>(); 

       return from buddyProp in buddyClassProperties 
         join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name 
         from attribute in buddyProp.Attributes.OfType<ValidationAttribute>() 
         where !attribute.IsValid(modelProp.GetValue(instance)) 
         select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance); 
      } 
     } 
    }