Table of Contents

FormValidators 允許您自訂每個驗證器的預設錯誤訊息,讓錯誤提示更符合您的應用需求。

概述

使用 ErrorMessageProvider 類別中的各個 SetAccessor 方法來設定驗證器的預設錯誤訊息。

基本用法

using CloudyWing.FormValidators.Core;

// 設定必填欄位的預設錯誤訊息
ErrorMessageProvider.SetValueIsRequiredAccessor((column, value) => $"{column} is required.");

// 設定整數驗證的預設錯誤訊息
ErrorMessageProvider.SetValueIsIntegerAccessor((column, value) => $"{column} must be a valid integer.");
Tip

建議在應用程式啟動時(如 Program.csStartup.cs)統一設定錯誤訊息,確保全域一致性。

Validator 與 Accessor 對應關係

RequiredValidator

  • SetValueIsRequiredAccessor:欄位為必填時的錯誤訊息
ErrorMessageProvider.SetValueIsRequiredAccessor((column, value) => 
    $"{column}為必填。");

IntegerValidator

  • SetValueIsIntegerAccessor:值不是有效整數
  • SetValueGreaterOrEqualAccessor:值小於最小值
  • SetValueLessOrEqualAccessor:值大於最大值
  • SetValueInRangeAccessor:值不在指定範圍內
ErrorMessageProvider.SetValueIsIntegerAccessor((column, value)
    => $"{column}必須為整數。");

ErrorMessageProvider.SetValueGreaterOrEqualAccessor((column, value, min)
    => $"{column}不得小於 {min}。");

ErrorMessageProvider.SetValueLessOrEqualAccessor((column, value, max)
    => $"{column}不得大於 {max}。");

ErrorMessageProvider.SetValueInRangeAccessor((column, value, min, max)
    => $"{column}必須介於 {min} 與 {max} 之間。");

NumberValidator

  • SetValueIsNumberAccessor:值不是有效數值
  • SetValueGreaterOrEqualAccessor:值小於最小值
  • SetValueLessOrEqualAccessor:值大於最大值
  • SetValueInRangeAccessor:值不在指定範圍內
ErrorMessageProvider.SetValueIsNumberAccessor((column, value) => 
    $"{column}必須為數值。");

DateTimeValidator

  • SetValueIsDateTimeAccessor:值不是有效日期
  • SetValueGreaterOrEqualAccessor:日期早於最小日期
  • SetValueLessOrEqualAccessor:日期晚於最大日期
  • SetValueInRangeAccessor:日期不在指定範圍內
ErrorMessageProvider.SetValueIsDateTimeAccessor((column, value) => 
    $"{column}必須為有效日期。");

ValueLengthValidator

  • SetValueLengthGreaterOrEqualAccessor:長度小於最小長度
  • SetValueLengthLessOrEqualAccessor:長度大於最大長度
  • SetValueLengthInRangeAccessor:長度不在指定範圍內
ErrorMessageProvider.SetValueLengthGreaterOrEqualAccessor((column, value, minLength)
    => $"{column}長度不得少於 {minLength} 個字元。");

ErrorMessageProvider.SetValueLengthLessOrEqualAccessor((column, value, maxLength)
    => $"{column}長度不得超過 {maxLength} 個字元。");

ErrorMessageProvider.SetValueLengthInRangeAccessor((column, value, minLength, maxLength)
    => $"{column}長度必須介於 {minLength} 與 {maxLength} 個字元之間。");

RegexValidator

  • SetValueMatchRegexAccessor:值不符合正規表示式
ErrorMessageProvider.SetValueMatchRegexAccessor((column, value, pattern)
    => $"{column}格式不正確。");

EmailValidator

  • SetValueIsEmailAccessor:值不是有效的 Email 格式
ErrorMessageProvider.SetValueIsEmailAccessor((column, value)
    => $"{column}必須為有效的 Email 地址。");

MobilePhoneValidator

  • SetValueIsMobilePhoneAccessor:值不是有效的手機號碼
ErrorMessageProvider.SetValueIsMobilePhoneAccessor((column, value)
    => $"{column}必須為有效的手機號碼。");

IdCardValidator

  • SetValueIsIdCardAccessor:值不是有效的身分證字號
ErrorMessageProvider.SetValueIsIdCardAccessor((column, value)
    => $"{column}必須為有效的身分證字號。");

CompareValidator

  • SetValueCompareAnotherColumnValueAccessor:兩個欄位的值不相等
ErrorMessageProvider.SetValueCompareAnotherColumnValueAccessor(
    (column, value, compareColumn, compareValue)
    => $"{column}必須與{compareColumn}相同。");

IntegerLessThanValidator

  • SetValueLessThanAnotherColumnValueAccessor:整數值不小於比較值
ErrorMessageProvider.SetValueLessThanAnotherColumnValueAccessor(
    (column, value, compareColumn, compareValue, allowedEqual)
    => allowedEqual 
        ? $"{column}必須小於或等於{compareColumn}。"
        : $"{column}必須小於{compareColumn}。");

NumberLessThanValidator

  • SetValueLessThanAnotherColumnValueAccessor:數值不小於比較值
Note

IntegerLessThanValidator 共用相同的 Accessor。

DateTimeLessThanValidator

  • SetValueLessThanAnotherColumnValueAccessor:日期不早於比較日期
Note

IntegerLessThanValidator 共用相同的 Accessor。

完整範例

以下範例展示如何在應用程式啟動時設定所有錯誤訊息:

using CloudyWing.FormValidators.Core;

public class Program {
    public static void Main(string[] args) {
        // 設定錯誤訊息
        ConfigureErrorMessages();

        // 您的應用程式邏輯...
    }

    private static void ConfigureErrorMessages() {
        // 基本驗證
        ErrorMessageProvider.SetValueIsRequiredAccessor((column, value)
            => $"{column}為必填欄位。");

        // 型別驗證
        ErrorMessageProvider.SetValueIsIntegerAccessor((column, value)
            => $"{column}必須為整數。");
        
        ErrorMessageProvider.SetValueIsNumberAccessor((column, value)
            => $"{column}必須為數值。");
        
        ErrorMessageProvider.SetValueIsDateTimeAccessor((column, value)
            => $"{column}必須為有效日期。");

        // 範圍驗證
        ErrorMessageProvider.SetValueInRangeAccessor((column, value, min, max)
            => $"{column}必須介於 {min} 與 {max} 之間。");

        // 長度驗證
        ErrorMessageProvider.SetValueLengthInRangeAccessor((column, value, minLength, maxLength)
            => $"{column}長度必須介於 {minLength} 與 {maxLength} 個字元之間。");

        // 格式驗證
        ErrorMessageProvider.SetValueIsEmailAccessor((column, value)
            => $"請輸入有效的 Email 地址。");
        
        ErrorMessageProvider.SetValueIsMobilePhoneAccessor((column, value)
            => $"請輸入有效的手機號碼。");

        // 比較驗證
        ErrorMessageProvider.SetValueCompareAnotherColumnValueAccessor(
            (column, value, compareColumn, compareValue)
            => $"{column}必須與{compareColumn}相同。");
    }
}

多語言支援

您可以根據使用者的語言偏好動態設定錯誤訊息:

public static void ConfigureErrorMessages(string language) {
    switch (language) {
        case "en-US":
            ErrorMessageProvider.SetValueIsRequiredAccessor((column, value)
                => $"{column} is required.");
            ErrorMessageProvider.SetValueIsEmailAccessor((column, value)
                => $"{column} must be a valid email address.");
            break;

        case "zh-TW":
            ErrorMessageProvider.SetValueIsRequiredAccessor((column, value)
                => $"{column}為必填欄位。");
            ErrorMessageProvider.SetValueIsEmailAccessor((column, value)
                => $"{column}必須為有效的 Email 地址。");
            break;
    }
}

最佳實踐

1. 統一管理

將所有錯誤訊息設定集中在一個方法中,便於維護:

public static class ErrorMessageConfig {
    public static void Configure() {
        // 所有錯誤訊息設定...
    }
}

2. 提供詳細資訊

錯誤訊息應包含足夠的資訊,讓使用者了解如何修正:

// ✗ 不夠明確
ErrorMessageProvider.SetValueLengthInRangeAccessor((column, value, min, max)
    => $"{column}長度錯誤。");

// ✓ 明確且有幫助
ErrorMessageProvider.SetValueLengthInRangeAccessor((column, value, min, max)
    => $"{column}長度必須介於 {min} 與 {max} 個字元之間(目前長度:{value?.Length ?? 0})。");

3. 考慮使用者體驗

使用友善的語氣,避免過於技術性的用語:

// ✗ 過於技術性
ErrorMessageProvider.SetValueIsIntegerAccessor((column, value)
    => $"{column}: Invalid integer format. Expected: [-]?[0-9]+);

// ✓ 使用者友善
ErrorMessageProvider.SetValueIsIntegerAccessor((column, value)
    => $"{column}必須為整數(例如:123、-456)。");

相關資源