我的应用程序中有某些属性需要动态设置,无论它们是否需要,因此我不能使用数据注释的 [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; }
}
验证工作完美!
谁能给我一个提示?或者告诉我我做错了什么?
谢谢!