При первом выборе пользователем значения из списка выбора мы показываем параметр по умолчанию с текстом Pick one
и значением -1
.
Чтобы помочь с этим, у нас есть собственный атрибут NotEqualAttribute
.Когда требуется раскрывающийся список, мы должны использовать оба атрибута, чтобы он работал правильно.
Наша виртуальная машина выглядит примерно так:
[DisplayName("Pick Role")]
[UIHint("DropDownList")]
[Required]
[NotEqual("-1", "Select value for DropDown")]
public Int64 DdlSelected { get; set; }
public List<DDLDispValueCV> DdlSelectedList { get; set; }
Мы бы предпочли использовать это:
[DisplayName("Pick Role")]
[UIHint("DropDownList")]
[Required]
public Int64 DdlSelected { get; set; }
public List<DDLDispValueCV> DdlSelectedList { get; set; }
В другом вопросе StackOverflow обсуждается, как сделать необнуляемые свойства необязательными, если только свойство Required
явно не установлено .
Я пытался это сделать, нозапутался, как добавить новый атрибут в коллекцию IEnumerable<Attribute>
и / или добавить его к ModelMetadata
в поставщике метаданных:
public class MyMetaDataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
// Change how required is marked.
// If required attribute found mark the IsRequired true, otherwise false.
metadata.IsRequired = attributes.Where(x => x is RequiredAttribute).Count() > 0;
// If working with a drop down.
// And required attribute is present
// Then add NotEqual attribute
if ((metadata.TemplateHint != null) && (metadata.TemplateHint.ToString() == "DropDownList"))
{
// only add attribue if required.
if (metadata.IsRequired)
{
// Add custom attribute NotEqual.
NotEqualAttribute newAttr = new NotEqualAttribute("-1", "(Pick One) is not valid selection");
IEnumerable<Attribute> newAttrs = attributes.Concat(new[] {newAttr});
metadata = base.CreateMetadata(newAttrs, containerType, modelAccessor, modelType, propertyName);
metadata.IsRequired = true;
}
}
}
}