【问题标题】:Validate a list in a custom validation attribute验证自定义验证属性中的列表
【发布时间】:2015-06-21 14:06:05
【问题描述】:

使用自定义验证属性,我正在尝试验证对象列表。该类如下所示:MyClass。在自定义属性中,我可以将object value 转换为对象列表,但是如何访问对象中的属性IdName

我知道我可以将属性直接放在 MyClass 属性上,但在验证之前我需要检查几件事。首先,我需要检查列表中的项目数是否大于一个。然后,如果计数大于一,我需要检查 IdName 是否都为空。

我的想法是在一个属性中验证整个列表会更容易。但是,即使我确实将属性放在 MyClass 属性上,我仍然需要访问列表中的值。

如果列表作为IsValidvalue 参数传递,则所有列表项都在值范围内。如果我将属性放在MyClass 属性上,我需要以另一种方式获取值。我已经能够使用下面的代码获取单个值,但我无法获取值列表。

底线:我需要一种从object value 参数或ValidationContext validationContext 参数访问列表中所有值的方法。

获取单个值(不是值列表):

var property = validationContext.ObjectType.GetProperty("MyProperty");
var value = property.GetValue(validationContext.ObjectInstance, null);

自定义属性:

public sealed class ValidateNewSauList : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var myList = value as IList;
    } 
}

这是用户定义的类:

public class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
}

【问题讨论】:

    标签: c# asp.net-mvc validation


    【解决方案1】:

    业务逻辑有点不清楚,所以,基于一个合格的猜测,解决方案可能如下。假设您有一个_lst = List<MyClass>,那么您可以遍历列表并将您的验证规则(例如称为方法ValidateID()ValidateName())应用于这两个属性:

    foreach (MyClass _mc in _lst)
    {
       ValidateID (_mc.Id);
       ValidateName (_mc.Name);
    
    }
    

    希望这可能会有所帮助。最好的问候,

    【讨论】:

    • 技术上我没有MyClass 的列表。该列表存在于模型中,但不存在于object value 参数或ValidationContext validationContext 参数中。值在那里,但它们的形式是一个通用的项目数组。
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多