我的应用程序中有某些属性我需要动态设置它们是否需要,因此我不能使用数据注释的[必需]属性。
也许这不是实现我想要的最佳方式。所以我会接受这方面的讽刺建议。 我用以下内容覆盖了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; }
}
验证工作完美!
任何人都可以给我一个提示吗?或者告诉我我做错了什么?
谢谢!
答案 0 :(得分:1)
对于高级验证,我建议您查看MVC的FluentValidation
http://fluentvalidation.codeplex.com/wikipage?title=mvc
您可以使用NuGet将其安装到项目中,您可以使用它创建自定义验证类。
答案 1 :(得分:1)
我相信你需要一个自定义的ModelMetadataProvider和一个自定义的ModelValidatorProvider来实现这一点。根据我的经验,他们似乎没有相互利用,似乎都设置了不同的验证。