В моем приложении есть определенные свойства, которые мне нужно установить динамически, независимо от того, требуются они или нет, поэтому я не могу использовать атрибут [Обязательный] для аннотаций данных.
Возможно, это не лучший способдобиться того, чего я хочу.Поэтому я приму радостные предложения на этот счет.Я переопределил 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; }
}
Проверка работает отлично!
Может кто-нибудь дать мне подсказку?Или скажите, что я делаю не так?
Спасибо!