• C#中手工进行声明式验证,从此远离if验证


    今天在一个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 字段是必需的。

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

  • 相关阅读:
    Django Admin后台管理用户密码修改
    【LOJ】#2122. 「HEOI2015」小 Z 的房间
    【LOJ】#2116. 「HNOI2015」开店
    【LOJ】#2117. 「HNOI2015」实验比较
    【LOJ】#2118. 「HEOI2015」兔子与樱花
    【LOJ】#2114. 「HNOI2015」菜肴制作
    【LOJ】#2115. 「HNOI2015」落忆枫音
    【LOJ】#2111. 「JLOI2015」战争调度
    【LOJ】#2110. 「JLOI2015」管道连接
    【LOJ】#2109. 「JLOI2015」骗我呢
  • 原文地址:https://www.cnblogs.com/dudu/p/annotation-based-validation.html
Copyright © 2020-2023  润新知