2013-02-12 36 views
8

Tôi có một tập hợp một số thuộc tính mà tất cả nên được sử dụng cùng lúc cho Giao diện người dùng và Xác thực. Ví dụ: đối với trường tiền tệ, tôi phải thêm Gợi ý giao diện người dùng, Logic xác thực và Định dạng hiển thị. Kết quả là, lớp của tôi trông rất đông đúc.Kết hợp các thuộc tính chú thích dữ liệu

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

Có cách nào để tạo ra một thuộc tính [Currency] kết hợp các chức năng của tất cả những thuộc tính này là một thuộc tính đơn giản? Mục tiêu của tôi là tạo các mục sau:

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

EDIT: Để làm rõ, tôi không có giao diện nào cho phép tôi triển khai chức năng của các thuộc tính khác nhau đó. Tôi có thể phân lớp ValidationAttribute, nhưng sau đó tôi cũng không thể phân lớp UIHintAttribute. Bất kỳ giải pháp tiềm năng khác mà tôi đang thiếu?

+0

câu hỏi thú vị. Đây là lãnh thổ @DarinDimitrov –

+0

Đoán của tôi là bạn sẽ cần một cái gì đó như Postsharp và sử dụng AOP. –

+0

Tôi rất tò mò về cách thực hiện điều này. Tôi rất muốn có thể thực hiện điều này – amhed

Trả lời

3

Theo số post và tham chiếu từ bài đăng tới số article của Phil Haack, bạn có thể tạo tùy chỉnh AssociatedMetadataProvider để thêm thuộc tính bạn cần. Bạn sẽ có một cái gì đó như thế này:

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

Và trong trường hợp bắt đầu ứng dụng:

ModelMetadataProviders.Current = new MyCustomMetadataProvider(); 
+0

Giải pháp tuyệt vời! Cám ơn rất nhiều! –

+0

@MattMurrell Giải pháp này có phù hợp với bạn không vì nó không hoạt động cho tôi - UIHintAttribute không hoạt động? – CodingYoshi

Các vấn đề liên quan