在.NET MVC 中,当页面提交model到Action的时候,自动填充ModelState。使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.ComponentModel.DataAnnotations中的各种方法进行验证。但是使用非MVC架构时,就需要写很多if判断或者正则表达式,当有多个字段需要验证的的时候不知道有多少人和我一样很厌烦这种用if判断的方式。这里记录一个方法,使用System.ComponentModel.DataAnnotations来实现自己的验证model抛出相应的错误信息。
C#文档地址:System.ComponentModel.DataAnnotations
 
这里我们先实现一个Person类,里面包含几个简单的属性,然后指定几个Attribute
public class Person
{
[Required(ErrorMessage = "{0} 必须填写")]
[DisplayName("姓名")]
public string Name { get; set; } [Required(ErrorMessage = "{0} 必须填写")]
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "邮件格式不正确")]
public string Email { get; set; } [Required(ErrorMessage = "{0} 必须填写")]
[Range(, , ErrorMessage = "超出范围")]
public int Age { get; set; } [Required(ErrorMessage = "{0} 必须填写")]
[StringLength(, MinimumLength = , ErrorMessage = "{0}输入长度不正确")]
public string Phone { get; set; } [Required(ErrorMessage = "{0} 必须填写")]
[Range(typeof(decimal), "1000.00", "2000.99")]
public decimal Salary { get; set; }
}

然后实现一个ValidatetionHelper静态类,这里主要用到的是Validator.TryValidateObject方法。

public static class ValidatetionHelper
{
public static ValidResult IsValid(object value)
{
ValidResult result = new ValidResult();
try
{
var validationContext = new ValidationContext(value, null, null);
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 = item.ErrorMessage,
ErrorMemberName = 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;
}
}

其中需要的返回结果类

public class ValidResult
{
public List<ErrorMember> ErrorMembers { get; set; }
public bool IsVaild { get; set; }
} public class ErrorMember
{
public string ErrorMessage { get; set; }
public string ErrorMemberName { get; set; }
}

实现一个测试代码,这里看到对应验证数据比使用多个if简洁很多,整个代码也十分美观。

static void Main(string[] args)
{
Person person = new Person();
person.Name = "";
person.Email = "121 212 K";
person.Phone = "";
person.Salary = ;
var result = ValidatetionHelper.IsValid(person);
if (!result.IsVaild)
{
foreach (ErrorMember errorMember in result.ErrorMembers)
{
Console.WriteLine(errorMember.ErrorMemberName + ":" + errorMember.ErrorMessage);
}
}
Console.Read();
}

通过测试,可以看到得到正确的验证结果。

后续有时间,把DisplayName给显示上去,那就更完美了。

参考:使用System.ComponentModel.DataAnnotations验证字段数据正确性

使用System.ComponentModel.DataAnnotations验证字段数据正确性的更多相关文章

  1. 对System.ComponentModel.DataAnnotations 的学习应用

    摘要 你还在为了验证一个Class对象中很多数据的有效性而写很多If条件判断吗?我也同样遇到这种问题,不过,最近学了一项新的方法,让我不在写很多if条件做判断,通过给属性标注特性来验证数据规则,从此再 ...

  2. System.ComponentModel.DataAnnotations 命名空间和RequiredAttribute 类

    System.ComponentModel.DataAnnotations 命名空间提供定义 ASP.NET MVC 和 ASP.NET 数据控件的类的特性. RequiredAttribute 指定 ...

  3. System.ComponentModel.DataAnnotations 冲突

    项目从原来的.NET Framework4.0 升级到 .NET Framework4.5 编译报错. 查找原因是: Entity Framework 与 .net4.5 的 System.Compo ...

  4. System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中

    Entity Framework 与 .net4.5 的 System.ComponentModel.DataAnnotations 都有 System.ComponentModel.DataAnno ...

  5. System.ComponentModel.DataAnnotations.Schema 冲突

    System.ComponentModel.DataAnnotations.Schema 冲突 Entity Framework 与 .net4.5 的 System.ComponentModel.D ...

  6. 解决EntityFramework与System.ComponentModel.DataAnnotations命名冲突

    比如,定义entity时指定一个外键, [ForeignKey("CustomerID")] public Customer Customer { get; set; } 编译时报 ...

  7. ASP.NET Core 6.0 基于模型验证的数据验证

    1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...

  8. C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间的特性

    目录: System.ComponentModel 特性命名空间与常用类 System.ComponentModel.DataAnnotations ComponentModel - Classes ...

  9. “CreateRiaClientFilesTask”任务意外失败。 未能加载文件程序集“System.ComponentModel.DataAnnot...

    错误  77  “CreateRiaClientFilesTask”任务意外失败.  System.Web.HttpException (0x80004005): 未能加载文件或程序集“System. ...

随机推荐

  1. SVM支持向量机(1)

    一.SVM模型 1.函数间隔与几何间隔,哪一条线是最好的? (1)公式化问题. 分类模型:当里面的值小于0的时候就是-1,当里面的值是大于等于0的时候就是1 函数间隔:前面乘以y(i),是为了保持数值 ...

  2. 11.css3动画--自定义关键帧动画--@keyframes/animation

    @keyframes设定动画规则,可以理解为动画的剧本. Name.自定义一个动画名称. 0-100%/from...to.... 需要变化的css样式属性. animation所有动画属性的简写.( ...

  3. 68. Text Justification (JAVA)

    Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...

  4. [转载]一个支持Verilog的Vim插件——AutoDef

    原文地址:一个支持Verilog的Vim插件--AutoDef作者:hover 支持一下四种类型的变量声明: 1)时序always块中的寄存器变量reg 2)组合always块中的组合reg变量reg ...

  5. matlab 中figure的图像 抗锯齿

    linehandle = plot(xxxxxx); set( linehandle, 'linesmoothing', 'on' );

  6. 安装wordpress的过程

    1 首先安装lamp.在安装php时,由于ubuntu16.04源中自带的是php7,所以需要直接安装 apt-get install phpapt-get install libapache2-mo ...

  7. 关闭mmu和cache

    处理器内部寄存器,访问速度最快,但是数量少 TCM:紧耦合存储器(Cache.主存储器) 辅助存储器(Flash.SD等) Cache是一种容量小但是存取速度非常快的存储器 它保存最近用到的存储器中的 ...

  8. 如何修改Git已提交的日志

    情况一:最后一次提交且未push 执行以下命令: git commit --amend git会打开$EDITOR编辑器,它会加载这次提交的日志,这样我们就可以在上面编辑,编辑后保存即完成此次的修改. ...

  9. Min-max theorem

    wiki链接

  10. 如何将vim打造成Linux下的source insight

    编写者:龙诗科 邮箱:longshike2010@163.com 2016-01-06 众所周知,windows下的source insight是阅读项目代码的神器,其神奇之处在于可以根据当前鼠标所指 ...