在MVC 3.0中,当设置IsRequired到属性的ModelMetadata时,它不会添加验证

时间:2012-02-10 15:03:41

标签: asp.net-mvc-3 modelmetadata modelmetadataprovider

我的应用程序中有某些属性我需要动态设置它们是否需要,因此我不能使用数据注释的[必需]属性。

也许这不是实现我想要的最佳方式。所以我会接受这方面的讽刺建议。 我用以下内容覆盖了DataAnnotationsModelMetadataProvider:

public class DynamicFieldsMetadataProvider : DataAnnotationsModelMetadataProvider
    {
        public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
        {
            if (containerType == null)
                throw new ArgumentNullException("containerType");

            if (!typeof(DynamicFieldDataItem).IsAssignableFrom(containerType))
                foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType))
                    yield return metadataProperty;
            else 
                foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType))
                {
                    var dynamicField = (DynamicFieldDataItem)container;
                    if (metadataProperty.PropertyName == "DataFieldValue")
                        metadataProperty.IsRequired = dynamicField.IsRequired;
                    yield return metadataProperty;
                }

        }
}

这只是一个概念测试,一旦我开始工作,我会将其改为动态和面向对象的东西,但到目前为止,只需能够将属性DataFieldValue的MetadataModel设置为IsRequired = true我就可以快点。

有了这个,我成功地以动态的方式设置了IsRequired属性为true(我想,这就足够了!),当我在我的视图中调试时:

@Html.EditorFor(model=>model.DataFieldValue)

属性DataFieldValue声明如下:

    public class DynamicFieldDataItem
    {
        public string DataFieldValue { get; set; }
        public bool IsRequired{ get; set; }
    }

我可以看到元数据,属性IsRequired为true,但是当呈现“DataFieldValue”时,“验证器”不存在,当然验证不起作用。

为了确保我的项目配置没有问题,我检查了web.config并包含了javascripts以进行验证,所有这些都已正确配置。更重要的是,如果我将属性Required添加到我的属性中,如下所示:

public class DynamicFieldDataItem
    {
        [Required]
        public string DataFieldValue { get; set; }
        public bool IsRequired{ get; set; }
    }

验证工作完美!

任何人都可以给我一个提示吗?或者告诉我我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

对于高级验证,我建议您查看MVC的FluentValidation

http://fluentvalidation.codeplex.com/wikipage?title=mvc

您可以使用NuGet将其安装到项目中,您可以使用它创建自定义验证类。

答案 1 :(得分:1)

我相信你需要一个自定义的ModelMetadataProvider和一个自定义的ModelValidatorProvider来实现这一点。根据我的经验,他们似乎没有相互利用,似乎都设置了不同的验证。