Как вы проводите валидацию модели веб-форм? - PullRequest
0 голосов
/ 09 апреля 2011

У нас есть приложение с тремя уровнями: пользовательский интерфейс, бизнес и данные. Уровень данных содержит Entity Framework v4 и автоматически генерирует наши объекты. Я создал класс друзей для сущности VendorInfo:

namespace Company.DataAccess
{
    [MetadataType(typeof(VendorInfoMetadata))]
    public partial class VendorInfo
    {
    }

    public class VendorInfoMetadata
    {
        [Required]
        public string Title;

        [Required]
        public string Link;

        [Required]
        public string LinkText;

        [Required]
        public string Description;
    }
}

Я хочу, чтобы эта проверка отображалась в пользовательском интерфейсе, включая назначенные им пользовательские сообщения проверки. В MVC это кусок пирога, но в веб-формах я понятия не имею, с чего начать. Каков наилучший способ использования проверки модели в веб-формах asp.net?

Я нашел статью , в которой объясняется, как создать для нее серверный элемент управления, но я не могу заставить его работать. Он компилирует и даже распознает элемент управления, но я никогда не смогу его запустить.

Есть идеи?

Спасибо всем.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2011

Я решил это. Может показаться, что серверный элемент управления , который я обнаружил , не предназначен для чтения полей в классе собеседника через атрибут MetadataType. Я изменил код, чтобы искать его атрибуты проверки в классе собеседника, а не сам класс сущности.

Вот модифицированная версия связанного серверного элемента управления:

    [DefaultProperty("Text")]
    [ToolboxData("<{0}:DataAnnotationValidator runat=server></{0}:DataAnnotationValidator>")]
    public class DataAnnotationValidator : BaseValidator
    {
        #region Properties

        /// <summary>
        /// The type of the source to check
        /// </summary>
        public string SourceTypeName { get; set; }

        /// <summary>
        /// The property that is annotated
        /// </summary>
        public string PropertyName { get; set; }

        #endregion

        #region Methods

        protected override bool EvaluateIsValid()
        {
            // get the type that we are going to validate
            Type source = GetValidatedType();

            // get the property to validate
            FieldInfo property = GetValidatedProperty(source);

            // get the control validation value
            string value = GetControlValidationValue(ControlToValidate);

            foreach (var attribute in property.GetCustomAttributes(
                     typeof(ValidationAttribute), true)
                       .OfType<ValidationAttribute>())
            {
                if (!attribute.IsValid(value))
                {
                    ErrorMessage = attribute.ErrorMessage;
                    return false;
                }
            }
            return true;
        }

        private Type GetValidatedType()
        {
            if (string.IsNullOrEmpty(SourceTypeName))
            {
                throw new InvalidOperationException(
                  "Null SourceTypeName can't be validated");
            }

            Type validatedType = Type.GetType(SourceTypeName);
            if (validatedType == null)
            {
                throw new InvalidOperationException(
                    string.Format("{0}:{1}",
                      "Invalid SourceTypeName", SourceTypeName));
            }

            IEnumerable<MetadataTypeAttribute> mt = validatedType.GetCustomAttributes(typeof(MetadataTypeAttribute), false).OfType<MetadataTypeAttribute>();
            if (mt.Count() > 0)
            {
                validatedType = mt.First().MetadataClassType;
            }

            return validatedType;
        }

        private FieldInfo GetValidatedProperty(Type source)
        {
            FieldInfo field = source.GetField(PropertyName);
            if (field == null)
            {
                throw new InvalidOperationException(
                  string.Format("{0}:{1}",
                    "Validated Property Does Not Exists", PropertyName));
            }
            return field;
        }

        #endregion
    }

Этот код только выглядит в классе приятелей. Если вы хотите, чтобы он проверил реальный класс, а затем класс его собеседника, вам придется соответствующим образом изменить его. Я не стал этого делать, потому что обычно, если вы используете класс партнера для атрибутов проверки, это потому, что вы не можете использовать атрибуты в основном классе сущности (например, Entity Framework).

0 голосов
/ 05 марта 2013

Для проверки модели в веб-формах я использую библиотеку DAValidation .Он поддерживает проверку на стороне клиента (включая ненавязчивую проверку), расширяемость, основанную на тех же принципах, что и в MVC.Это MS-PL лицензировано и доступно через Nuget .

А вот немного устарела статья , описывающая, с помощью какого управления мыслями был собран.

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