加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 组合数据注释属性

发布时间:2020-12-16 04:32:58 所属栏目:asp.Net 来源:网络整理
导读:我有一些属性的集合,这些属性应该总是一起用于UI和验证.例如,对于货币字段,我必须添加UI提示,验证逻辑和显示格式.结果,我的班级看起来非常拥挤. public class Model{ [UIHint("Currency")] [DisplayFormat(ApplyFormatInEditMode = true,DataFormatString =
我有一些属性的集合,这些属性应该总是一起用于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,OnlyOnClientSide = true)]
    [SetMetaDataForCustomModelBinder("Currency")]
    public double? Profit { get; set; }
}

有没有办法创建一个[Currency]属性,将所有这些属性的功能组合成一个简单的属性?我的目标是创建以下内容:

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

编辑:为了澄清,我已经尝试创建自定义属性,但没有暴露的接口允许我实现这些不同属性的功能.我可以继承ValidationAttribute,但是我也不能将UIHintAttribute子类化.我还缺少任何其他潜在的解决方案?

解决方法

根据 post以及帖子中对Phil Haack的 article的引用,您可以创建自定义的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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读