13

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

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

提前致谢。

4

1 回答 1

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

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

ModelMetadataProviders.Current = new MyMetadataProvider();
于 2009-11-02T17:48:27.227 回答