Asp.net mvc ASP.NET MVC ModelMetaData:是否有方法根据RequiredAttribute设置IsRequired?

Asp.net mvc ASP.NET MVC ModelMetaData:是否有方法根据RequiredAttribute设置IsRequired?,asp.net-mvc,asp.net-mvc-2,data-annotations,Asp.net Mvc,Asp.net Mvc 2,Data Annotations,Brad Wilson在ASP.NET MVC的新ModelMetaData上发布了一系列精彩的博客: 在本文中,他描述了ModelMetaData类现在如何在视图和模板化帮助器中公开。如果字段是必需的,我想在表单字段标签旁边显示一个星号,所以我考虑使用ModelMetaData的IsRequired属性。但是,对于所有不可为空的属性,IsRequired默认为true,而对于所有可为空的属性,IsRequired默认为false。问题是,字符串总是可以为null的,因此字符串的IsRequi

Brad Wilson在ASP.NET MVC的新ModelMetaData上发布了一系列精彩的博客:

在本文中,他描述了ModelMetaData类现在如何在视图和模板化帮助器中公开。如果字段是必需的,我想在表单字段标签旁边显示一个星号,所以我考虑使用ModelMetaData的IsRequired属性。但是,对于所有不可为空的属性,IsRequired默认为true,而对于所有可为空的属性,IsRequired默认为false。问题是,字符串总是可以为null的,因此字符串的IsRequired属性总是false。有人知道如何覆盖IsRequired的默认设置吗?或者,我考虑利用我一直在装饰属性的RequiredAttribute属性,但是RequiredAttribute似乎没有通过ModelMetaData类公开。有人知道如何避开这个问题吗


提前感谢。

您需要创建自己的ModelMetadataProvider。下面是一个使用DataAnnotationsModelBinder的示例

public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
        protected override ModelMetadata CreateMetadata(Collections.Generic.IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
        {
            var _default = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
            _default.IsRequired = attributes.Where(x => x is RequiredAttribute).Count() > 0;
            return _default;
        }
}

谢谢这正是我一直在寻找的解决方案。然而,我似乎无法让它正常工作。即使我的属性是用RequiredAttribute修饰的,并且它正确地显示在CreateMatadata()的“attributes”列表中,attributes.Where(x=>x.Equals(typeof(RequiredAttribute)))返回一个空列表,这导致IsRequired仍然为false。这个lambda表达式有什么问题吗?“x.Equals(typeof(RequiredAttribute))”应该是“x是RequiredAttribute”。x是属性的实例,而不是属性的类型。太棒了,谢谢你的解决方案。您还可以将LINQ查询简化为一个简单的
属性
ModelMetadataProviders.Current = new MyMetadataProvider();