簡體   English   中英

如何將對象傳遞給自定義數據注釋驗證器

[英]How to pass a object to a custom Data annotation Validator

我想創建一個自定義數據注釋驗證器來檢查列表中的所有項是否唯一。 例如

public class AnyClass{

  [Unique]
  public List<string> UniqueListOfStrings;
}

現在我的Unique屬性看起來像這樣

public sealed class UniqueAttribute : ValidationAttribute
{

    public UniqueAttribute()
        : base("The items are not unique")
    {
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var listOfValues = (IList<object>)value;
        return listOfValues.Count != listOfValues.Distinct().Count()
                   ? new ValidationResult(ErrorMessageString)
                   : ValidationResult.Success;
    }
}

直到現在它很好,但我想讓屬性更通用,因為我可以傳遞實現IEqualityComparer<T>的任何類的對象。 這樣我的新IsValid方法就像

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    var listOfValues = (IList<object>)value;
    return listOfValues.Count !=
           (_comparerClass != null
                ? listOfValues.Distinct(_comparerClass).Count()
                : listOfValues.Distinct().Count())
               ? new ValidationResult(ErrorMessageString)
               : ValidationResult.Success;
}

問題是我無法發送對象。 是否有任何解決方法,以便我可以使用比較器類來比較對象。

我沒有找到任何解決方案將對象傳遞給自定義數據注釋驗證器,但解決了我制作自定義數據注釋驗證器以檢查列表中的所有項是否唯一的問題。 這是代碼:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    if(value == null)
        return ValidationResult.Success;
    var iComparableValues = ((IList)value).Cast<IComparable>().ToList();
    return AreElementsUnique(iComparableValues)
               ? ValidationResult.Success
               : new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}

private static bool AreElementsUnique(IList<IComparable> listOfValues)
{
    var length = listOfValues.Count;
    for(var i = 0;i< length;i++ )
    {
        for(var j =i+1; j< length;j++)
        {
            if(listOfValues[i].CompareTo(listOfValues[j]) ==0)
                return false;
        }
    }
    return true;
}

我所做的是,而不是假設比較實現IEqualityComparer<T>任何類,我現在假設我將比較任何實現IComparable接口的類。 這樣我就可以實現Unique自定義屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM