ASP.NET MVC ModelMetaData:有没有办法根据RequiredAttribute设置IsRequired?

Joh*_*ika 13 asp.net-mvc data-annotations asp.net-mvc-2

Brad Wilson在ASP.NET MVC的新ModelMetaData上发布了一个很棒的博客系列:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html

在其中,他描述了如何在Views和模板化助手中公开ModelMetaData类.我想要做的是如果字段是必需的,在表单字段标签旁边显示一个星号,所以我考虑使用ModelMetaData的IsRequired属性.但是,默认情况下,IsRequired对于所有非可空属性都是true,而对于所有可为空的属性都是false.问题是,字符串总是可以为空的,因此字符串的IsRequired属性始终为false.有谁知道如何覆盖IsRequired的默认设置?或者,我考虑利用我一直在用我的属性装饰的RequiredAttribute属性,但似乎没有通过ModelMetaData类公开RequiredAttribute.有谁知道如何解决这个问题?

提前致谢.

zow*_*ens 17

您需要创建自己的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;
        }
}
Run Code Online (Sandbox Code Playgroud)

然后在Global.asax的AppStartup中,您需要将以下内容连接到MyMetadataProvider作为默认元数据提供程序:

ModelMetadataProviders.Current = new MyMetadataProvider();
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,谢谢你的解决方案.您还可以将LINQ查询简化为一个简单的`attributes.Any(x => x is RequiredAttribute);`. (7认同)
  • "x.Equals(typeof(RequiredAttribute))"应为"x is RequiredAttribute".*x*是属性的实例,而不是属性的类型. (3认同)