В MVC 3.0 при установке IsRequired для ModelMetadata свойства он не добавляет проверку

В моем приложении есть определенные свойства, которые мне нужно установить динамически, независимо от того, требуются они или нет, поэтому я не могу использовать атрибут [Обязательный] Аннотаций данных.

Может быть, это не лучший способ добиться того, чего я хочу. Поэтому я приму радостные предложения на этот счет. Я переопределил DataAnnotationsModelMetadataProvider с помощью:

public class DynamicFieldsMetadataProvider : DataAnnotationsModelMetadataProvider
    {
        public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
        {
            if (containerType == null)
                throw new ArgumentNullException("containerType");

            if (!typeof(DynamicFieldDataItem).IsAssignableFrom(containerType))
                foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType))
                    yield return metadataProperty;
            else 
                foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType))
                {
                    var dynamicField = (DynamicFieldDataItem)container;
                    if (metadataProperty.PropertyName == "DataFieldValue")
                        metadataProperty.IsRequired = dynamicField.IsRequired;
                    yield return metadataProperty;
                }

        }
}

Это просто концептуальный тест. Как только я заставлю его работать, я изменю его на что-то динамическое и более объектно-ориентированное, но пока, имея возможность установить MetadataModel для свойства DataFieldValue в IsRequired = true, я могу приступить к работе.

После этого я успешно установил динамическое свойство свойства IsRequired в true (я думал, что этого будет достаточно!), И когда я отлаживаю в своем представлении:

@Html.EditorFor(model=>model.DataFieldValue)

Свойство DataFieldValue объявлено так:

    public class DynamicFieldDataItem
    {
        public string DataFieldValue { get; set; }
        public bool IsRequired{ get; set; }
    }

Я вижу, что метаданные имеют свойство IsRequired в значении true, но когда отображается "DataFieldValue", "валидатор" отсутствует, и, конечно, проверка не работает.

Чтобы убедиться, что не было проблем с настройкой моего проекта, я проверил web.config и включение javascripts для проверки, все настроено правильно. Более того, если я добавлю атрибут "Требуется" к своему свойству, например так:

public class DynamicFieldDataItem
    {
        [Required]
        public string DataFieldValue { get; set; }
        public bool IsRequired{ get; set; }
    }

Проверка работает отлично!

Кто-нибудь может дать мне подсказку? Или скажи мне, что я делаю не так?

Спасибо!

2 ответа

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

Для продвинутых проверок я рекомендую вам взглянуть на FluentValidation for MVC

http://fluentvalidation.codeplex.com/wikipage?title=mvc

вы можете установить его в свой проект, используя NuGet, и вы можете создавать собственные классы проверки с его помощью.

Другие вопросы по тегам