C#MVC框架中的model验证,在其他架构中使用(Winform或控制台)
在.NET MVC中,当页面提交model到Action的时候,自动填充ModelState。使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.ComponentModel.DataAnnotations和System.ComponentModel中的各种方法进行验证。
但是,使用非MVC架构时,就需要写很多if判断或者正则表达式,当有多个字段需要验证的时候就需要写很多if判断,即繁琐,又不美观。这里记录一个方法,使用System.ComponentModel.DataAnnotations和System.ComponentModel来实现自己的验证model抛出相应的错误信息。
1、首先编写要验证的类(UserInfo),并添加特性(Attribute);注意引用System.ComponentModel和System.ComponentModel.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Model
{
//DisplayName 显示名
//Required 必填项
//StringLength 字符串长度
//Range 数学范围(小数点)
//RegularExperssion 正则表达式验证--在线正则表达式
//Compare 两次比较
/// <summary>
/// 需要验证的数据模型,添加特性
/// </summary>
public class UserInfo
{
[DisplayName("姓名")]
[Required(ErrorMessage = "必须填写")]
public string Name { get; set; }
[DisplayName("邮件")]
[Required(ErrorMessage = "必须填写")]
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "格式不正确")]
public string Email { get; set; }
[DisplayName("年龄")]
[Required(ErrorMessage = "必须填写")]
[Range(1, 100, ErrorMessage = "超出范围")]
public int Age { get; set; }
[DisplayName("电话")]
[Required(ErrorMessage = "必须填写")]
[StringLength(11, MinimumLength = 11, ErrorMessage = "输入长度不正确")]
public string Phone { get; set; }
}
}
2、编写验证帮助静态类,主要用到的是Validator.TryValidateObject方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace Validatetion
{
/// <summary>
/// 自动验证帮助类
/// </summary>
public class ValidatetionHelper
{
/// <summary>
/// 自动验证
/// </summary>
/// <param name="value">要验证的类型名称</param>
/// <returns>错误结果</returns>
public static ValidResult IsValid(object value)
{
ValidResult result = new ValidResult();
try
{
var validationContext = new ValidationContext(value);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(value, validationContext, results, true);
if (!isValid)
{
result.IsVaild = false;
result.ErrorMembers = new List<ErrorMember>();
foreach (var item in results)
{
result.ErrorMembers.Add(new ErrorMember()
{
ErrorMessage = GetDisplayName(value, item.MemberNames.FirstOrDefault()) + " " + item.ErrorMessage,
ErrorMemberName = item.MemberNames.FirstOrDefault()
//ErrorMemberName = GetDisplayName(value, item.MemberNames.FirstOrDefault())
});
}
}
else
{
result.IsVaild = true;
}
}
catch (Exception ex)
{
result.IsVaild = false;
result.ErrorMembers = new List<ErrorMember>();
result.ErrorMembers.Add(new ErrorMember()
{
ErrorMessage = ex.Message,
ErrorMemberName = "Internal error"
});
}
return result;
}
/// <summary>
/// 获取类型的属性的DisplayName
/// </summary>
/// <param name="modelType"></param>
/// <param name="propertyDisplayName"></param>
/// <returns></returns>
public static string GetDisplayName(object modelType, string propertyDisplayName)
{
return (System.ComponentModel.TypeDescriptor.GetProperties(modelType)[propertyDisplayName].Attributes[typeof(System.ComponentModel.DisplayNameAttribute)] as System.ComponentModel.DisplayNameAttribute).DisplayName;
}
}
/// <summary>
/// 错误名称和信息
/// </summary>
public class ErrorMember
{
/// <summary>
/// 错误信息
/// </summary>
public string ErrorMessage { get; set; }
/// <summary>
/// 错误属性名称
/// </summary>
public string ErrorMemberName { get; set; }
}
/// <summary>
/// 验证结果
/// </summary>
public class ValidResult
{
/// <summary>
/// 错误集合
/// </summary>
public List<ErrorMember> ErrorMembers { get; set; }
/// <summary>
/// 错误状态,true表示验证成功
/// </summary>
public bool IsVaild { get; set; }
}
}
3、上层使用验证帮助类,验证需要验证的数据模型类。
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Validatetion;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
UserInfo userInfo = new UserInfo()
{
Name = "",
Age = 101,
Email = "sdfdfasdf",
Phone = "133232131231231"
};
var validResult = ValidatetionHelper.IsValid(userInfo);
if (!validResult.IsVaild)
{
foreach (ErrorMember errorMember in validResult.ErrorMembers)
{
Console.WriteLine(errorMember.ErrorMessage);
}
}
Console.Read();
}
}
}
4、运行结果
5、Demo如下:
环境:VS2017和.net framework 4.5.2
控制台程序运行 上面是全部代码,不会的可以自行下载
Demo下载地址