Настройте ModelMetadata с помощью CreateMetadata - PullRequest
1 голос
/ 13 мая 2011

При первом выборе пользователем значения из списка выбора мы показываем параметр по умолчанию с текстом 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;
            }
        }
     }  
}
...