ValidationErrors нестандартного атрибута ValidationAttribute отображается неправильно - PullRequest
5 голосов
/ 17 ноября 2011

У меня есть созданный атрибут ValidationAttribute, который используется совместно сервером и клиентом.Чтобы заставить атрибут валидации правильно генерироваться для клиента при обращении к классу помощника данных, я должен был быть очень конкретным в том, как я его построил.

Проблема, с которой я столкнулся, заключается в том, что по какой-то причине, когдаЯ возвращаю ValidationResult из моего пользовательского класса атрибута проверки, он не обрабатывается так же, как другие атрибуты проверки в пользовательском интерфейсе клиента.Вместо отображения ошибки ничего не происходит.Тем не менее, он будет правильно проверять объект, он просто не отображает результат неудачной проверки.

Ниже приведен код одного из моих пользовательских классов проверки.

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

namespace Project.Web.DataLayer.ValidationAttributes
{
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    public class DisallowedChars : ValidationAttribute
    {
        public string DisallowedCharacters
        {
            get
            {
                return new string(this.disallowedCharacters);
            }

            set
            {
                this.disallowedCharacters = (!this.CaseSensitive ?     value.ToLower().ToCharArray() : value.ToCharArray());
            }
        }

        private char[] disallowedCharacters = null;

        private bool caseSensitive;

        public bool CaseSensitive
        {
            get
            {
                return this.caseSensitive;
            }

            set
            {
                this.caseSensitive = value;
            }
        }

        protected override ValidationResult IsValid(object value, ValidationContext    validationContext)
        {
            if (value != null && this.disallowedCharacters.Count() > 0)
            {
                string Value = value.ToString();

                foreach(char val in this.disallowedCharacters)
                {
                    if ((!this.CaseSensitive && Value.ToLower().Contains(val)) ||     Value.Contains(val))
                    {
                        return new ValidationResult(string.Format(this.ErrorMessage != null ? this.ErrorMessage : "'{0}' is not allowed an allowed character.", val.ToString()));
                    }
                }
            }

            return ValidationResult.Success;
        }
    }
}

Это то, как я использую его над моими Свойствами как на сервере, так и на клиенте.

[DisallowedChars(DisallowedCharacters = "=")]

И я попробовал несколько разных способов настройки привязки.

{Binding Value, NotifyOnValidationError=True}

Так же как и

{Binding Value, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, ValidatesOnNotifyDataErrors=True}

Кажется, что ни один из них не делает формы, с которыми они связаны, также подтверждают правильность записей.Я пытался использовать этот атрибут для значений, которые связаны с TextBoxes, XamGrids, и ни один из них не проверять должным образом, как они должны.

Эта проблема возникает только тогда, когда я пытаюсь использовать ValidationResult на стороне сервера.Если я использую результат проверки значения в моей модели представления, он будет корректно подтвержден.Мне нужно найти способ сделать это правильно из сгенерированного кода.

Любые мысли очень приветствуются.

1 Ответ

4 голосов
/ 17 ноября 2011

Вам необходимо указать MemberNames, которые связаны с ValidationResult. В конструкторе ValidationResult есть дополнительный параметр для указания свойств, связанных с результатом. Если вы не укажете какие-либо свойства, результат будет обработан как ошибка проверки на уровне объекта.

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

protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
 if (value != null && this.disallowedCharacters.Count() > 0) {
   string Value = value.ToString();

   foreach(char val in this.disallowedCharacters) {
     if ((!this.CaseSensitive && Value.ToLower().Contains(val)) || Value.Contains(val)) {
       //return new ValidationResult(string.Format(this.ErrorMessage != null ? this.ErrorMessage : "'{0}' is not allowed an allowed character.", val.ToString()));
       string errorMessage = string.Format(this.ErrorMessage != null ? this.ErrorMessage : "'{0}' is not allowed an allowed character.", val.ToString());
       return new ValidationResult(errorMessage, new string[] { validationContext.MemberName});
     }
   }
 }

 return ValidationResult.Success;
}

Для привязок вам не нужно указывать что-либо еще. Итак, простая Binding

{Binding Value}

должно отображать ошибки, потому что ValidatesOnNotifyDataErrors неявно установлено в значение true. NotifyOnValidationError заполняет ValidationErrors другими элементами, такими как ValidationSummary.

У Джеффа Хэнли есть действительно goog сообщение в блоге о валидации в WCF Ria Services и Silverlight, могу рекомендовать прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...