0

在我们的数据库中,我们有几个用于参照完整性的代码表(例如 emailTypes、phoneTypes、countryCodes、stateCodes)。在我们的应用程序中,我们将这些表加载并缓存到通用列表中。现在,应用程序对每个列表都有自定义 ValidationAttributes,以查看提交的值是否在硬编码的值列表中。我相信这可以用一个新的自定义validationAttribute重写,它接受一个通用列表、用于搜索值的属性和值的数据类型,如果值存在于列表中,则返回valid。

首先,我想知道是否可以在自定义验证属性中使用在运行时填充的编译时间列表。

如果是这样,是否有人已经为此提出了一个好的解决方案?如果没有,是否有工作可以解决?

如果您包含用于 js 验证的 IClientValidatable,我将包含奖励积分(不是 stackoverflow 有奖励积分)。

4

2 回答 2

0

您可以使用以下代码来实现中央验证逻辑

public abstract class GenericValidationAttribute:ValidationAttribute
{
    protected GenericValidationAttribute(DataValidationType dataValidationType)
    {
        ValidationType = dataValidationType;
    }

    protected DataValidationType ValidationType { get; set; }

    public override bool IsValid(object value)
    {
        switch (ValidationType)
        {
            case DataValidationType.Email:
                //Check if the value is in the built-in emails
                break;
            case DataValidationType.Phone:
                //Check if the value is in the phone list
                break;
        }

        return base.IsValid(value);
    }
}

public class EmailValidationAttribute : GenericValidationAttribute
{
    public EmailValidationAttribute() : base(DataValidationType.Email)
    {}

}


public enum DataValidationType
{
    Email,
    Phone,
    Country,
    State
}

只需将验证逻辑放入通用验证属性中,并让其他特定的验证类继承自它。

干杯。

于 2014-04-29T05:23:22.653 回答
0

我做了几个假设。

  1. 集合在静态类中作为静态属性
  2. 集合继承自 IList

首先你需要自定义属性

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class ListCheckAttribute : ValidationAttribute
{
    // The name of the class that holds the collection
    public Type ContainerType { get; private set; }
    // The name of the property holding the list
    public string PropertyName { get; private set; }

    public ListCheckAttribute(Type ContainerType, String PropertyName)
    {
        this.ContainerType = ContainerType;
        this.PropertyName = PropertyName;
    }

    public override bool IsValid(object value)
    {
        var property = ContainerType.GetProperty(this.PropertyName);
        var val = property.GetMethod.Invoke(null, null);
        var list = (IList)val;
        return list.Contains(value);
    }
}

public class MyClass
{
    [ListCheck(typeof(CollectionClass), "Collection")]
    public int NumberToValidate { get; set; }

    public MyClass()
    {
        NumberToValidate = 4;
    }
}

现在,当验证处理程序调用 IsValid 时,它会从列表中获取属性并将它们转换为 IList,以便可以完成包含。对于类,他们所要做的就是实现 IEquatable 并实现 Equals 方法,它们也能正常工作。

于 2014-08-05T15:48:57.693 回答