WPF 및 Entity Framework로 DataAnnotations를 사용하여 데이터의 유효성을 검사 하시겠습니까?

.net data-annotations entity-framework validation wpf

문제

WPF 및 Entity Framework에서 DataAnnotations를 사용하여 유효성을 검사 할 수있는 방법이 있습니까?

수락 된 답변

여기에 설명 된대로 DataAnnotations.Validator 클래스를 사용할 수 있습니다.

http://johan.driessen.se/archive/2009/11/18/testing-dataannotation-based-validation-in-asp.net-mvc.aspx

그러나 메타 데이터에 "친구"클래스를 사용하는 경우 여기에 설명 된대로 유효성을 검사하기 전에 해당 사실을 등록해야합니다.

http://forums.silverlight.net/forums/p/149264/377212.aspx

TypeDescriptor.AddProviderTransparent(
  new AssociatedMetadataTypeTypeDescriptionProvider(typeof(myEntity), 
    typeof(myEntityMetadataClass)), 
  typeof(myEntity));

List<ValidationResult> results = new List<ValidationResult>();
ValidationContext context = new ValidationContext(myEntity, null, null)
bool valid = Validator.TryValidateObject(myEntity, context, results, true);

[Shimmy의 코멘트에 응답하기 위해 다음을 추가했습니다.]

위의 로직을 구현하는 일반적인 메소드를 작성하여 모든 객체에서 호출 할 수 있도록했습니다.

// If the class to be validated does not have a separate metadata class, pass
// the same type for both typeparams.
public static bool IsValid<T, U>(this T obj, ref Dictionary<string, string> errors)
{
    //If metadata class type has been passed in that's different from the class to be validated, register the association
    if (typeof(T) != typeof(U))
    {
        TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
    }

    var validationContext = new ValidationContext(obj, null, null);
    var validationResults = new List<ValidationResult>();
    Validator.TryValidateObject(obj, validationContext, validationResults, true);

    if (validationResults.Count > 0 && errors == null)
        errors = new Dictionary<string, string>(validationResults.Count);

    foreach (var validationResult in validationResults)
    {
        errors.Add(validationResult.MemberNames.First(), validationResult.ErrorMessage);
    }

    if (validationResults.Count > 0)
        return false;
    else
        return true;
}

유효성을 검사해야하는 각 객체에서이 메서드에 대한 호출을 추가합니다.

[MetadataType(typeof(Employee.Metadata))]
public partial class Employee
{
    private sealed class Metadata
    {
        [DisplayName("Email")]
        [Email(ErrorMessage = "Please enter a valid email address.")]
        public string EmailAddress { get; set; }
    }

    public bool IsValid(ref Dictionary<string, string> errors)
    {
        return this.IsValid<Employee, Metadata>(ref errors);
        //If the Employee class didn't have a buddy class,
        //I'd just pass Employee twice:
        //return this.IsValid<Employee, Employee>(ref errors);
    }
}

인기 답변

나는 Craigs 대답에서 누락 된 것은 실제로 유효성 검사 오류가 있는지를 실제로 확인하는 방법이라고 생각합니다. 이것은 DataAnnotation 검증 러너로서 Steve Sanderson이 다른 계층에서 유효성 검사를 실행하고 프리젠 테이션을 실행하려는 사용자를 위해 작성되었습니다 ( http://blog.codeville.net/category/xval/ , 코드는 예제 프로젝트에 있음).

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);
}

WPF에 익숙하지 않다. (궁금한 점이있다면 확실하지 않다.) 어쩌면 그것을 사용할 수도있다.

또한 어떤 경우에는 유효성 검사 규칙을 제대로 평가하지 못하지만 결코 실패하지 않는다는 블로그에 대한 의견이 있습니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.