我正在编写一个PropertiesMustMatch
验证属性,可以将字符串属性名称作为参数。我希望它在该对象上按名称查找相应的属性并进行基本的相等比较。 通过反思访问此内容的最佳方式是什么?
此外,我检查了企业库中的验证应用程序块,并确定其PropertyComparisonValidator太强烈,无法满足我们的需求。
更新为了进一步说明(提供一些上下文),目标只是强制执行字段匹配(例如,密码验证)。如果可能的话,我们希望它能够使用从ValidationAttribute
类继承的属性级属性数据注释。
更新:如果有人好奇,我最后通过调整代码提供的解决方案来解决实际的业务问题question
答案 0 :(得分:4)
答案 1 :(得分:1)
你做不到。另见this question。尝试更改逻辑以使用对象,检查其属性,反之亦然。您还可以提供有关任务的更多信息,而不仅仅是这个狭隘的问题。
答案 2 :(得分:0)
你可以这样。
//target class
public class SomeClass{
[CustomRequired(ErrorMessage = "{0} is required", ProperytName = "DisplayName")]
public string Link { get; set; }
public string DisplayName { get; set; }
}
//custom attribute
public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
public string ProperytName { get; set; }
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var propertyValue = "Value";
var parentMetaData = ModelMetadataProviders.Current
.GetMetadataForProperties(context.Controller.ViewData.Model, context.Controller.ViewData.Model.GetType());
var property = parentMetaData.FirstOrDefault(p => p.PropertyName == ProperytName);
if (property != null)
propertyValue = property.Model.ToString();
yield return new ModelClientValidationRule
{
ErrorMessage = string.Format(ErrorMessage, propertyValue),
ValidationType = "required"
};
}
}