簡體   English   中英

在 C# 中使用 DataAnnotations 進行驗證時,如何防止重復出現相同的錯誤消息文本?

[英]How to prevent the repetition of the same error message text when validating using DataAnnotations in C#?

我正在開發一個應用程序,我使用DataAnnotations來驗證傳遞給 class 屬性的值。 由於我有幾個不同的類,它們的許多屬性具有相似的驗證規則,我想為ErrorMessage參數定義一個返回格式化字符串的方法。 問題是,當我在驗證屬性中使用此方法時,出現以下錯誤:

“屬性參數必須是屬性參數類型 PrototypeValidationData 的常量表達式、typeof 表達式或數組創建表達式”

閱讀這篇文章,我了解到該屬性不支持將方法作為參數,但我想知道是否有任何方法可以防止在所有屬性定義中重復相同的錯誤消息。 有沒有其他選擇?

遵循我正在嘗試做的一個例子:

    public class Foo
    {
        public string Id { get; set; }

        [Range(double.Epsilon, double.MaxValue, ErrorMessage = ErrorMessages.MustBeGreaterThanZero(Bar.ToString(), "Foo", Id, "Bar"))]
        public double Bar { get; set; }
    }

    public static class ErrorMessages
    {
        public static string MustBeGreaterThanZero(string str,
                                                   string senderClass,
                                                   string senderId,
                                                   string senderField)
        {
            return String.Format("The value {0} assigned to the field {1} in {2} ID {3} must be greater than ZERO.",
                                 str, senderField, senderClass, senderId);
        }

您可以創建從RangeAttribute繼承的自定義驗證屬性。

public class RangeCustomAttribute : System.ComponentModel.DataAnnotations.RangeAttribute
{
    public RangeCustomAttribute(double minimum, 
                                double maximum,
                                string senderClass,
                                string senderId,
                                string senderField) : base(minimum, maximum)
    {
        SenderClass = senderClass;
        SenderId = senderId;
        SenderField = senderField;
    }

    public string SenderClass { get; }
    public string SenderId { get; }
    public string SenderField { get; }

    protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
    {
        var result = base.IsValid(value, validationContext);

        if (result != ValidationResult.Success)
        {
            var instance = validationContext.ObjectInstance;
            Type type = instance.GetType();

            var idValue = type.GetProperty(SenderId)?.GetValue(instance, null);

            var err = $"The value {value} assigned to the field {SenderField} in {SenderClass} ID {idValue} must be greater than ZERO.";

            result = new ValidationResult(err, new List<string> { validationContext.DisplayName });
        }

        return result;
    }
}

順便說一下SenderClassSenderField可以從反射中讀取,所以你也許這個參數是多余的。 像這樣:

public class RangeCustom2Attribute : System.ComponentModel.DataAnnotations.RangeAttribute
{
    public RangeCustom2Attribute(double minimum,
                                double maximum,
                                string senderId) : base(minimum, maximum)
    {
        SenderId = senderId;
    }

    public string SenderId { get; }

    protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
    {
        var result = base.IsValid(value, validationContext);

        if (result != ValidationResult.Success)
        {
            var instance = validationContext.ObjectInstance;
            Type type = instance.GetType();

            var senderClass = type.Name;

            var senderField = validationContext.MemberName;

            var idValue = type.GetProperty(SenderId)?.GetValue(instance, null);

            var err = $"The value {value} assigned to the field {senderField} in {senderClass} ID {idValue} must be greater than ZERO.";

            result = new ValidationResult(err, new List<string> { validationContext.DisplayName });
        }

        return result;
    }
}

暫無
暫無

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

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