2013-02-12 24 views
8

Ho una raccolta di diversi attributi che dovrebbero essere sempre utilizzati insieme per l'interfaccia utente e la convalida. Ad esempio per un campo valuta, devo aggiungere un suggerimento UI, logica di convalida e formattazione dello schermo. Di conseguenza, la mia classe sembra molto affollata.Combina gli attributi di annotazione dati

public class Model 
{ 
    [UIHint("Currency")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")] 
    [CustomRegularExpression(Currency.ValidationPattern, OnlyOnClientSide = true)] 
    [SetMetaDataForCustomModelBinder("Currency")] 
    public double? Cost { get; set; } 

    [UIHint("Currency")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")] 
    [CustomRegularExpression(Currency.ValidationPattern, OnlyOnClientSide = true)] 
    [SetMetaDataForCustomModelBinder("Currency")] 
    public double? Profit { get; set; } 
} 

Esiste un modo per creare un attributo [Currency] che combina le funzionalità di tutti questi attributi per essere un attributo semplice? Il mio obiettivo sarebbe quello di creare la seguente:

public class Model 
{ 
    [Currency] public double? Cost { get; set; } 
    [Currency] public double? Profit { get; set; } 
} 

EDIT: Per chiarire, ho cercato di creare un attributo personalizzato, ma non ci sono interfacce esposte che mi permettesse di implementare la funzionalità di questi attributi diversi. Posso eseguire la sottoclasse di ValidationAttribute, ma in questo caso non riesco nemmeno a sottoclasse UIHintAttribute. Qualche altra potenziale soluzione mi manca?

+0

interessante domanda. Questo è il territorio @DarinDimitrov –

+0

Suppongo che tu abbia bisogno di qualcosa come Postsharp e di utilizzare AOP. –

+0

Sono curioso di sapere come si farebbe. Mi piacerebbe essere in grado di farlo – amhed

risposta

3

Secondo lo post e un riferimento dal post a Phil Haack article è possibile creare il proprio AssociatedMetadataProvider personalizzato che aggiunge gli attributi necessari. Avrete qualcosa di simile:

public class MyCustomMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
    { 
     var attributeList = attributes.ToList(); 
     if (attributeList.OfType<CurrencyAttribute>().Any()) 
     { 
      attributeList.Add(new UIHintAttribute("Currency")); 
      attributeList.Add(new DisplayFormatAttribute 
      { 
       ApplyFormatInEditMode = true, 
       DataFormatString = "{0:C}" 
      }); 
     } 

     return base.CreateMetadata(attributeList, containerType, modelAccessor, modelType, propertyName); 
    } 
} 

E in caso di avvio di applicazione:

ModelMetadataProviders.Current = new MyCustomMetadataProvider(); 
+0

Ottima soluzione! Grazie mille! –

+0

@MattMurrell Questa soluzione ha funzionato per te perché non funziona per me: UIHintAttribute non funziona? – CodingYoshi

Problemi correlati