【发布时间】:2014-01-30 22:07:33
【问题描述】:
我想编写自定义验证属性,并在验证结果中添加有验证错误的其他成员名称。问题是我想根据属性名称和无效的匹配属性索引或键(我想验证 IEnumerables 或 IDictionaries)动态生成成员名称,例如 Names[0]、Names[1]、Names[key] 等。例如:
型号:
public class ModelClass
{
[ItemMaxLength(10)]
[Display(ResourceType = typeof(CategoriesRename), Name = "CategoryNamesFieldName")]
public IDictionary<string, string> Names { get; set; }
}
属性:
public class ItemMaxLengthAttribute : ValidationAttribute
{
private readonly int _maxLength = int.MaxValue;
public ItemMaxLengthAttribute(int maxLength)
{
_maxLength = maxLength;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
...
// I can get instance and it's type from validation context
var instance = validationContext.ObjectInstance; // which is instance of ModelClass
var instanceType = validationContext.ObjectType; //which is typeof(ModelClass)
var dispayName = validationContext.DisplayName; //which is value of Display attribute
...
}
}
所以主要思想是(我不喜欢它)让当前属性通过它的DysplayName 属性值(dispayName)进行验证。我有点卡在这里一段时间。也许还有其他方法可以获取正在验证的属性的属性信息?
P.S.我已经尝试过MemberName 属性,正如Alexandre Rondeau 所建议的那样,但问题是validationContext.MemberName = null 所以它不能被使用。 MSDN 还说 此属性表示实体成员名称,而不是相应数据字段的名称,我需要 相应数据字段的名称。
【问题讨论】:
-
1) 在您的示例
ModelClass中,[ItemMaxLength]未应用于Names属性。您在哪里应用验证属性? 2) 当您在该示例中说 相应数据字段的名称 时,该名称是什么?不是名字吗? -
@AlexandreRondeau, 1) 我已经将属性应用于
Names属性(我可能只是忘记在示例中演示它)2) 是的,它是Names。 .. 应该是...但是validationContext.MemberName是null。所以我在获取 Names 时遇到了一些麻烦。
标签: c# asp.net-mvc validation reflection properties