【问题标题】:In MVC 3.0 when Setting IsRequired to the ModelMetadata of a Property, it doesn't add the validation在 MVC 3.0 中,将 IsRequired 设置为属性的 ModelMetadata 时,它不会添加验证
【发布时间】:2012-04-12 17:54:29
【问题描述】:

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

也许这不是实现我想要的最佳方式。所以在这方面我会接受高兴的建议。 我已经用以下内容覆盖了 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; }
    }

验证工作完美!

谁能给我一个提示?或者告诉我我做错了什么?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我相信您需要自定义 ModelMetadataProvider 和自定义 ModelValidatorProvider 才能正常工作。根据我的经验,它们似乎没有相互利用,而且似乎都设置了不同的验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-05
        • 2013-08-29
        • 2014-02-24
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多