簡體   English   中英

使用數據注釋進行模型驗證的錯誤消息

[英]Error messages for model validation using data annotations

鑒於以下類:

using System.ComponentModel.DataAnnotations;

public class Book{
   public Contact PrimaryContact{get; set;}
   public Contact SecondaryContact{get; set;}

   [Required(ErrorMessage="Book name is required")]
   public string Name{get; set;}
}
public class Contact{
    [Required(ErrorMessage="Name is required")]
    public string Name{get; set;}
}

有沒有一種干凈的方法可以使用DataAnnotationsBook每個Contact實例提供不同的錯誤消息? 例如,如果PrimaryContact實例中缺少姓名,則錯誤將顯示為“需要主要聯系人姓名”。

我當前的解決方案是創建一個驗證服務,檢查模型狀態是否存在字段錯誤,然后刪除所述錯誤並使用我喜歡的特定語言將它們添加回來。

這是我知道的唯一方法,但它遠非干凈。 它涉及使用子類化和 MetaData 類來“覆蓋”錯誤消息。

public class Book
{
    public PrimaryContact PrimaryContact { get; set; }
    public SecondaryContact SecondaryContact { get; set; }

    [Required(ErrorMessage = "Book name is required")]
    public string Name { get; set; }
}

public class Contact
{
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
}

[MetadataType(typeof(PrimaryContactMD))]
public class PrimaryContact : Contact
{
    class PrimaryContactMD
    {
        [Required(ErrorMessage = "Primary Contact Name is required")]
        public string Name { get; set; }
    }
}

[MetadataType(typeof(SecondaryContactMD))]
public class SecondaryContact : Contact
{
    class SecondaryContactMD
    {
        [Required(ErrorMessage = "Secondary Contact Name is required")]
        public string Name { get; set; }
    }
}

您可能希望針對此類屬性使用CustomValidation特性,而不是依賴於Required特性。

CustomValidation將允許您根據要驗證的屬性更精細地定制驗證消息。 我已經使用context.DisplayName動態顯示正在驗證的屬性的名稱,只是為了簡潔起見,但這可以根據您的需要進一步自定義。

如果需要進一步定制,您可以為每個單獨的屬性編寫不同的CustomValidation處理程序,而不是像我在代碼示例中所做的那樣重復使用相同的處理程序。

using System.ComponentModel.DataAnnotations;

public class Book {
    [CustomValidation(typeof(Book), "ValidateContact")]
    public Contact PrimaryContact { get; set; }

    [CustomValidation(typeof(Book), "ValidateContact")]
    public Contact SecondaryContact { get; set; }

    [Required(ErrorMessage = "Book name is required")]
    public string Name { get; set; }

    public static ValidationResult ValidateContact(Contact contact, ValidationContext context) {
        ValidationResult result = null;

        if (contact == null) {
            result = new ValidationResult($"{context.DisplayName} is required.");
        } else if (string.IsNullOrWhiteSpace(contact.Name)) {
            result = new ValidationResult($"{context.DisplayName} name is required.");
        }

        return result;
    }
}

public class Contact {
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
}

我也在尋找這個問題的答案,到目前為止,如果您在錯誤消息中執行以下操作:“{0} 聯系人姓名是必需的”,它將自動替換變量的名稱。 我認為有一種方法可以明確使用此功能。

C#中的以下代碼格式化數據注釋錯誤和格式為單個字符串中的附加格式

  public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid == false)
            {
                if (actionContext.ModelState.IsValid) return;
                string errors = actionContext.ModelState.SelectMany(state => state.Value.Errors).Aggregate("", (current, error) => current + (error.ErrorMessage + ". "));
            }
        }
    }

暫無
暫無

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

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