0

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

也许这不是实现我想要的最佳方式。所以在这方面我会接受高兴的建议。我已经用以下内容覆盖了 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 进行验证,所有配置都正确。更重要的是,如果我将所需的属性添加到我的属性中,如下所示:

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

验证工作完美!

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

谢谢!

4

2 回答 2

1

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

于 2012-04-12T09:54:29.453 回答
1

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

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

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

于 2012-02-10T15:10:13.033 回答