今天在一个ASP.NET MVC Controller Action中写代码时,需要对ViewModel的字段进行验证。但这个Action处理的是手工编写的ajax请求(不是表单提交),无法使用ASP.NET MVC Validation功能。

MVC Action示例代码如下:

public async Task<ActionResult> Save(int? postId, PostModel post)
{
//验证post的属性,比如Titile不能为空
}

按照以前的写法,就要写if语句进行判断:

public async Task<ActionResult> Save(int? postId, PostModel post)
{
if(string.IsNullOrEmpty(post.Title))
{
return Content("Title 字段是必需的。");
}
}

但今天在声明式验证的美丽身姿的诱惑下,再也不想写这样的累赘代码,于是采取行动,作出改变。

声明式验证只需要在要验证的ViewModel的字段上加上相应的声明,比如针对文中的示例:

public class PostModel
{
[Required]
public string Title { get; set; }
}

但现在的代码场景需要手工触发这个验证并且拿到验证结果,那如何实现呢?

。。。

后来在网上找到了解决方法——Manual Validation with Data Annotations

只需调用 System.ComponentModel.DataAnnotations.Validator.TryValidateObject() 就能实现,示例实现代码如下:

public async Task<ActionResult> Save(int? postId, PostModel post)
{
var validationContext = new ValidationContext(post);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(post, validationContext, results, true); if (!isValid)
{
return Content(string.Join("<br/>", results.Select(x => x.ErrorMessage)));
}
else
{
return Content("OK");
}
}

执行结果:

Title 字段是必需的。

从此可以借助声明式验证让代码更漂亮。

最新文章

  1. 夺命雷公狗----Git---6---GitHub基本使用
  2. 转:微信Android客户端架构演进之路
  3. WPF、Silverlight项目中使用柱状图、饼状图、折线图
  4. Topcoder SRM 628 DIV 2
  5. APUE 3 -- 信号(signal)&lt;I&gt; :概念
  6. Mac效率:配置Alfred web search
  7. Web 性能优化:Preload与Prefetch的使用及在 Chrome 中的优先级
  8. CSS3_伸缩盒模型_弹性布局_等分布局_flex 布局
  9. 《Java从入门到精通》学习总结1
  10. 如何下载官网上下载历史Java版本(老版本Java)
  11. sql server 行转列存储过程
  12. 阿里图标库使用IconFont
  13. sql-DDL, DML 常用语句
  14. 3、爬虫之selenium模块
  15. mysqlpump:更加合理的mysql数据库逻辑备份工具
  16. glog日志
  17. oracle05
  18. apache -- xampp配置虚拟主机
  19. Dom-直接 /间接选择器
  20. 解决Pandoc wasn&#39;t found.pdflatex not found on PATH

热门文章

  1. java, poi, excel
  2. python生成器和迭代器
  3. 为什么匿名内部类和局部内部类只能访问final变量
  4. MS sql server 基础知识回顾(二)-表连接和子查询
  5. 百思不得骑姐的问题——难道是控件的bug?
  6. C# 判断是否联网
  7. CoreData创建
  8. mybatis(三)懒加载
  9. UISearchBar
  10. NSPredicate谓词