gpt4 book ai didi

c# - 从验证属性中检索模型元数据

转载 作者:行者123 更新时间:2023-11-30 14:12:24 24 4
gpt4 key购买 nike

使用 MVC4,我需要从自定义 ValidationAttribute 中检索当前的 ModelMetadata。这样做的原因是验证属性需要知道哪些其他属性附加到正在验证的特定属性。

具体来说,它会检查属性是否附加了 UppercaseAttribute;如果是这种情况,那么它将执行不同的逻辑路径。如果可以从 ValidationAttribute 中获取 ModelMetadata,我将使用以下代码进行检查:

ModelMetadata.ContainerType
.GetProperty(ViewData.ModelMetadata.PropertyName)
.GetCustomAttributes(typeof(UppercaseAttribute), true)

首先,是否可以从自定义 ValidationAttribute 中检索 ModelMetadata

其次,上面的代码是检查属性是否附加了特定属性的最佳实践。

最佳答案

以下是您可以执行的操作:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = validationContext.ObjectInstance;

var displayName = validationContext.DisplayName;
var propertyName = model.GetType().GetProperties()
.Where(p => p.GetCustomAttributes(false).OfType<DisplayAttribute>().Any(a => a.Name == displayName))
.Select(p => p.Name).FirstOrDefault();
if (propertyName == null)
propertyName = displayName;

var property = model.GetType().GetProperty(propertyName);
var uppercaseAttribute = property.GetCustomAttributes(typeof(UppercaseAttribute), false).SingleOrDefault() as UppercaseAttribute;

if (uppercaseAttribute != null)
{
// some code...
}

// return validation result...
}

出于某种原因,validationContext.MemberName 始终为 null,因此您必须根据其显示名称获取属性名称。

关于c# - 从验证属性中检索模型元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com