6

Ho il seguente attibute basato UIHInt:Come trovare la proprietà di destinazione di un attributo UIHInt?

[AttributeUsage(AttributeTargets.Property)] 
public class DropDownListAttribute : UIHintAttribute, IMetadataAware 
{ 
    public DropDownListAttribute(string selectListName) 
     : base(KnownUiHints.DropDown, KnownPresentationLayers.Mvc, selectListName) 
    { 
     SelectListName = selectListName; 
    } 

    public string SelectListName { get; set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues[KnowMetadataKeys.SelectListName] = SelectListName; 
    } 
} 

Il suo scopo è quello di assegnare un SelectList ad una proprietà della vista unico valore modello da selezionare da un elenco, come questo:

public class DemoModel: ViewModel 
{ 
    [Required] 
    [DropDownList("LanguageSelect")] 
    [Display(Name = "Language")] 
    public int? LanguageId { get; set; } 

    public SelectList LanguageSelect { get; set; } 
} 

ho questo funziona ora con alcuni macchinari molto Golbergiani e il mio provider di metadati, ma avendo scoperto IMetadataAware.OnMetadataCreated, sento di poterlo semplificare. In questo momento aggiungo il SelectListName ai metadati, quindi faccio un salto attraverso alcuni anelli per a) Ottieni la SelectList in una sorta di dizionario globale e b) estrai l'elenco di selezione da quel dizionario quando esegui il rendering dell'elenco a discesa.

Vorrei aggiungere la SelectList ai metadati del modello nell'attributo, cioè i metadati locali alla proprietà a cui si applica l'attributo, ma come accedere a tale proprietà o al suo tipo di contenuto?

+0

quale metodo HtmlHelper stai usando in immagine per l'uscita della lista? – MarkG

risposta

0

Codice di esempio per accedere agli attributi su Pocos. C'è un singolo o multi versione attributo di guardare

chiamata di esempio per il metodo

var MutliAttributeList = MyStatic.GetPocoMultiAttribute<MyAttribute>(typeof(poco),"AttrName"); 


public static UAttribute GetPocoAttribute<TPoco, UAttribute>(string attributeName) { 
     var result = typeof (TPoco).GetCustomAttributes(true) 
            .Where(attribute => attribute.GetType() 
                   .Name == attributeName) 
            .Cast<UAttribute>() 
            .FirstOrDefault(); 
     return result; 
    } 

public static IEnumerable<UAttribute> GetPocoMultiAttribute<UAttribute>(Type pocoType, string attributeName) { 
     var result = pocoType.GetCustomAttributes(true) 
          .Where(attribute => attribute.GetType() 
                  .Name == attributeName).Cast<UAttribute>().ToList(); 
     return result; 
    } 
Problemi correlati