В 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, и вы можете создавать собственные классы проверки с его помощью.