2013-02-12 26 views
8

Tümüyle UI ve Doğrulama için birlikte kullanılması gereken çeşitli öznitelikler koleksiyonum var. Örneğin bir döviz alanı için bir UI İpucu, Doğrulama Mantığı ve Görüntü Biçimlendirme eklemeliyim. Sonuç olarak, sınıfım çok kalabalık görünüyor.Veri ek açıklama niteliklerini birleştirin

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; } 
} 

basit bir özellik olmaya Bütün bu niteliklerin işlevselliği birleştiren bir [Currency] niteliğini oluşturmak için herhangi bir yolu var mı? Amacım şu oluşturmak olacaktır:

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

DÜZENLEME: açıklığa kavuşturmak için, ben özel bir özellik oluşturarak denedi, ama bana bu farklı özelliklerin işlevselliğini uygulamak için izin verecek maruz hiçbir arabirimler vardır. ValidationAttribute alt sınıfını yapabilirim, ancak UIHintAttribute alt sınıfını da oluşturamıyorum. Kaybettiğim başka potansiyel çözümler var mı?

+0

ilginç soru Böyle bir şey olacaktır. Bu @DarinDimitrov toprakları –

+0

Tahminimce, Postsharp gibi bir şeye ihtiyacınız olacak ve AOP kullanacaksınız. –

+0

Bunun nasıl olacağını merak ediyorum. Bunu yapabilmek çok isterim – amhed

cevap

3

post ve postadan Phil Haack'ın article numaralı referansına göre, gereksinim duyduğunuz özellikleri ekleyen özel AssociatedMetadataProvider oluşturabilirsiniz.

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); 
    } 
} 

Ve uygulama başlangıç ​​olay:

ModelMetadataProviders.Current = new MyCustomMetadataProvider(); 
+0

Harika çözüm! Çok teşekkürler! –

+0

@MattMurrell Bu çözüm sizin için işe yaradı çünkü benim için çalışmıyor - UIHintAttribute çalışmıyor mu? – CodingYoshi

İlgili konular