验证数据输入的合法性(二)

简介

前面写了:
验证数据输入的合法性(一) - wzwyc - 博客园
https://www.cnblogs.com/wzwyc/p/17894900.html

一般验证失败的时候,想着要执行某些操作。
例如,如果验证输入字段不正确,则把光标切换到对应的输入框等等。

这样的话,之前的方式就有一点不是特别方便。
于是对前面的类进行了升级改造。

实现类

升级改造后的类:

namespace CgdataBase;

/// <summary>
/// 数据验证控制类
/// </summary>
public class ValidationController
{
    private readonly StringBuilder _builder;
    private readonly List<Action> _actions;

    /// <summary>
    /// 当前结果已经失败的时候,忽略后面的检测
    /// 如果属性设置为false,则不管当前是否检测为异常,都执行后面所有的验证
    /// </summary>
    public bool IgnoreOnFailure { get; set; }

    /// <summary>
    /// 失败回调函数的执行方式
    /// </summary>
    public ActionMode ActionMode { get; set; }

    /// <summary>
    /// 验证的结果
    /// </summary>
    public bool VerificationResult { get; private set; }

    public ValidationController()
    {
        VerificationResult = true;
        _builder = new StringBuilder();
        _actions = new List<Action>();
    }

    /// <summary>
    /// 验证输入的字符串是否正确
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="text"></param>
    /// <param name="keyName"></param>
    /// <param name="func"></param>
    /// <param name="action"></param>
    public void InputValueIsValid<T>(string text, string keyName, Func<T, bool> func, Action action)
    {
        if (IgnoreOnFailure && !VerificationResult)
            return;

        var result = InputValueIsValid<T>(text, keyName, func, _builder);
        if (result == false)
        {
            VerificationResult = false;
            if (action != null)
                _actions.Add(action);
        }
    }

    /// <summary>
    /// 验证对象是否正确
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <param name="keyName"></param>
    /// <param name="func"></param>
    /// <param name="action"></param>
    public void CheckObjectIsValid<T>(T obj, string keyName, Func<T, bool> func, Action action)
    {
        if (IgnoreOnFailure && !VerificationResult)
            return;

        var result = CheckObjectIsValid<T>(obj, keyName, func, _builder);
        if (result == false)
        {
            VerificationResult = false;
            if (action != null)
                _actions.Add(action);
        }
    }

    public static bool InputValueIsValid<T>(string text, string keyName, Func<T, bool> func, StringBuilder builder)
    {
        try
        {
            if (text.IsNullOrEmpty())
            {
                builder?.AppendLine($"请输入 {keyName}");
                return false;
            }

            var value = (T)Convert.ChangeType(text, typeof(T));
            if (func != null)
            {
                var result = func.Invoke(value);
                if (result == false)
                {
                    builder?.AppendLine($"请输入正确的 {keyName}");
                }

                return result;
            }

            return true;
        }
        catch (Exception)
        {
            builder?.AppendLine($"请输入正确的 {keyName}");
        }

        return false;
    }

    public static bool CheckObjectIsValid<T>(T obj, string keyName, Func<T, bool> func, StringBuilder builder)
    {
        try
        {
            if (obj == null)
            {
                builder?.AppendLine($"{keyName} 为空");
                return false;
            }

            if (func != null)
            {
                var result = func.Invoke(obj);
                if (result == false)
                {
                    builder?.AppendLine($"{keyName} 不正确");
                }

                return result;
            }

            return true;
        }
        catch (Exception)
        {
            builder?.AppendLine($"{keyName} 不正确");
        }

        return false;
    }

    /// <summary>
    /// 获取验证失败的提示信息
    /// </summary>
    /// <returns></returns>
    public string GetErrorMessage()
    {
        return _builder.ToString();
    }

    /// <summary>
    /// 执行验证失败的回调函数
    /// </summary>
    public void ExecuteFailedAction()
    {
        if (_actions.IsNullOrEmpty())
            return;

        switch (ActionMode)
        {
            case ActionMode.JustFirst:
                _actions.First().Invoke();
                break;

            case ActionMode.JustLast:
                _actions.Last().Invoke();
                break;

            case ActionMode.ExecuteAll:
                _actions.ForEach(s => s.Invoke());
                break;

            default:
                break;
        }
    }
}

/// <summary>
/// 失败回调函数的执行方式
/// </summary>
public enum ActionMode
{
    /// <summary>
    /// 只执行第一个
    /// </summary>
    JustFirst,

    /// <summary>
    /// 只执行最后一个
    /// </summary>
    JustLast,

    /// <summary>
    /// 全部执行
    /// </summary>
    ExecuteAll
}

使用示例

下面是使用的示例:

ValidationController controller = new ValidationController();
controller.ActionMode = ActionMode.JustFirst;
controller.InputValueIsValid<double>(Amount, "金额", s => s > 0, () => AmountFocused++);
controller.InputValueIsValid<string>(TradingName, "交易名称", s => s.IsContainValidText(), () => TradingNameFocused++);
controller.InputValueIsValid<string>(TransactionChannel, "交易渠道", s => s.IsContainValidText(), () => TransactionChannelFocused++);
controller.InputValueIsValid<string>(Category, "交易类别", s => s.IsContainValidText(), () => CategoryFocused++);
controller.InputValueIsValid<string>(PaymentChannel, "支付方式", s => s.IsContainValidText(), () => PaymentChannelFocused++);

if (controller.VerificationResult == false)
{
    MessageBox.Show(controller.GetErrorMessage());
    controller.ExecuteFailedAction();
    return;
}

使用说明

其中有两个属性可以设置:

IgnoreOnFailure

如果这个属性设置为true,那么只要检测到异常以后,后面的所有检测都会跳过。

ActionMode

失败回调函数的执行方式。如果有多个字段都失败了,执行哪几个回调函数。

posted @ 2023-12-18 15:32  wzwyc  阅读(21)  评论(0编辑  收藏  举报