8

UI と検証のために常に一緒に使用する必要があるいくつかの属性のコレクションがあります。たとえば、通貨フィールドの場合、UI ヒント、検証ロジック、および表示形式を追加する必要があります。その結果、私のクラスはとても混雑しているように見えます。

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

[Currency]これらすべての属性の機能を組み合わせて 1 つの単純な属性にする属性を作成する方法はありますか? 私の目標は、次のものを作成することです。

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

編集:明確にするために、カスタム属性を作成しようとしましたが、これらのさまざまな属性の機能を実装できるようにするインターフェイスは公開されていません。ValidationAttribute をサブクラス化できますが、UIHintAttribute もサブクラス化できません。私が見逃している他の潜在的な解決策はありますか?

4

1 に答える 1

3

投稿と投稿から Phil Haack の記事への参照によると、AssociatedMetadataProvider必要な属性を追加するカスタムを作成できます。次のようなものがあります。

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

そして、アプリケーション開始イベントでは:

ModelMetadataProviders.Current = new MyCustomMetadataProvider();
于 2013-02-13T20:51:40.047 に答える