В MVC 3.0 при установке значения IsRequired для ModelMetadata свойства оно не добавляет проверку - PullRequest
0 голосов
/ 10 февраля 2012

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

Возможно, это не лучший способдобиться того, чего я хочу.Поэтому я приму радостные предложения на этот счет.Я переопределил 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и включение JavaScript для проверки, все правильно настроено.Более того, если я добавлю атрибут «Обязательно» к своему свойству, например:

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

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2012

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

1 голос
/ 10 февраля 2012

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

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

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

...