验证数据输入的合法性(二)
简介
前面写了:
验证数据输入的合法性(一) - 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
失败回调函数的执行方式。如果有多个字段都失败了,执行哪几个回调函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧