Проверить использование данных DataAnnotations с WPF & Entity Framework?

Существует CSS Сетки Yahoo, который может сделать все виды вещей.

, Но помните: CSS НЕ ЯВЛЯЕТСЯ РЕЛИГИЕЙ . При сохранении часов при помощи таблиц вместо css сделайте так.

Один из угловых случаев я никогда не мог составлять свой ум о, формы. Я хотел бы сделать это в css, но это именно так намного более сложно, чем таблицы.

Вы могли даже утверждать, что формы являются таблицами, в этом у них есть заголовки (маркировки) и данные (поля ввода).

35
задан Matthew Murdoch 14 May 2012 в 15:40
поделиться

6 ответов

Вы можете использовать класс 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);
{{1 }}

[Добавлено следующее в ответ на комментарий Шимми]

Я написал общий метод для реализации вышеупомянутой логики, чтобы любой объект мог его вызвать:

// 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);
    }
}
46
ответ дан 27 November 2019 в 07:13
поделиться

Я думаю, что в ответе Крейгса не хватает того, как на самом деле проверить наличие ошибок валидации. Это средство проверки подлинности DataAnnotation, написанное Стивом Сандерсоном для тех, кто хочет выполнить проверку проверки на отличном уровне, а затем в презентации ( 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 (не уверен, есть ли какое-нибудь готовое решение для вашего вопроса), но, возможно, вы сможете его использовать.

Также есть некоторые комментарии к его блог, что в некоторых случаях он не может правильно оценить правило проверки, но это никогда не подводило меня.

4
ответ дан 27 November 2019 в 07:13
поделиться

Используйте «приятельский класс». Номер 4 в этой инструкции .

0
ответ дан 27 November 2019 в 07:13
поделиться

У меня был тот же вопрос и обнаружил следующие идеи:

1
ответ дан 27 November 2019 в 07:13
поделиться

В .NET 4 есть поддержка проверки в Entity-Framework с использованием этого расширения, проверьте: http: / /blogs.msdn.com/adonet/archive/2010/01/13/introduction-the-portable-extensible-metadata.aspx

Я не уверен, что он использует DataAnnotations.

ОБНОВЛЕНИЕ
Я пробовал это с VB.NET, и это не сработало, я думаю, что он поддерживает только проекты C #.

0
ответ дан 27 November 2019 в 07:13
поделиться

Я написал валидатор на основе Contributor, который включает участника проверки DataAnnotation, а также проверяет наличие нарушенных привязок (где пользователь ввел неправильный тип)

http://adammills.wordpress.com/2010/07/21/mvvm-validation-and-type-checking/

0
ответ дан 27 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: