欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[.NET] 使用ValidationContext快速进行模型资料的验证

程序员文章站 2022-06-30 13:52:08
在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断若是使用ValidationContext,就可以省去很多自行撰写程式码的工作 要使用ValidationContext的验证方式很简单,我先用一个简单的例子来说明就可以呈现所需要的结果 1.首先 ......

在进行webapi功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断
若是使用validationcontext,就可以省去很多自行撰写程式码的工作

要使用validationcontext的验证方式很简单,我先用一个简单的例子来说明就可以呈现所需要的结果

1.首先先在专案中建立一个新的模型档案,并在模型档案中加入下面的程式码

public class validmodels
{
    /// <summary>
    /// 輸入資料的模型
    /// </summary>
    public class validinfoquery
    {
        [required]
        public string name { get; set; }
        public string tel { get; set; }
        public string address { get; set; }
        [required]
        [range(1, 130)]
        public int age { get; set; }
        [required]
        public datetime birthday { get; set; }
    }

    /// <summary>
    /// 回傳驗證結果的模型
    /// </summary>
    public class validinforesult
    {
        public bool isvalid { get; set; }
        public list<validitem> list { get; set; }
        public class validitem
        {
            public ienumerable<string> field { get; set; }
            public string message { get; set; }
        }
    }
}

  

在这个模型中,我们定义了要输入的资料模型,以及要回传的模型定义,在输入的模型validinfoquery中,特别在"name"、"age"、"birthday"三个栏位中,加上[required]的属性。并且在"age"的栏位中,加入[range(1, 130)]的属性,代表age的合法值在1到130之间

2.接着加入一个新的控制器"validcontroller.cs",加入一个post的方法,并将刚刚新增的模型,分别放入input以及output的参数

public class validcontroller : apicontroller
{
    /// <summary>
    /// 執行資料寫入的post動作
    /// </summary>
    /// <param name="query"></param>
    public models.validmodels.validinforesult post(models.validmodels.validinfoquery query)
    {

    }
}

  3.一般传统进行输入资料验证的方式,会采用下面的方式进行验证

// 傳統欄位驗證的寫法

// 驗證name欄位
if (string.isnullorempty(query.name))
{
    result.isvalid = false;
    result.list.add(new models.validmodels.validinforesult.validitem()
    {
        field = new list<string> { "name" },
        message = "name欄位必填"
    });
}

// 驗證age欄位
if (query.age > 130 || query.age < 1)
{
    result.isvalid = false;
    result.list.add(new models.validmodels.validinforesult.validitem()
    {
        field = new list<string> { "age" },
        message = "age欄位必須在1與130之間"
    });
}

  但是这样的写法,一但input模型的栏位增加的话,程式码也会相对的增加。也会影响程式码的效率。所以我们将验证的方式更改一下,改为validationcontext进行验证

// 使用validationcontext的驗證物件
// 定義validationcontext的驗證物件
var context = new validationcontext(query);

// 定義進行validation回傳的訊息
var validationresults = new list<validationresult>();

// 進行驗證動作
bool isvalid = validator.tryvalidateobject(query, context, validationresults, true);

// 將驗證結果進行處理,並回傳到指定的回傳物件中
result.isvalid = isvalid;
result.list = validationresults.select(c => new models.validmodels.validinforesult.validitem()
                                {
                                    field = c.membernames,
                                    message = c.errormessage
                                })
                                .tolist();

  

从上面的程式码可以很清楚的看到,只要定义出一个validationcontext物件,并将要验证的模型资料传入,就可以在tryvalidateobject的方法中,将所有资料不合法的栏位进行验证并得到结果

4.程式码完成后,我们实际执行刚刚的程式内容,并透过swagger进行资料的输入。其中name的栏位以及age的栏位我刻意输入了不合法的内容

 [.NET] 使用ValidationContext快速进行模型资料的验证

按下"try it"之后,得到的结果如下图所示

[.NET] 使用ValidationContext快速进行模型资料的验证

可以看到,在结果的显示上,很清楚的列出"name "与"age"两个栏位是验证失败的,也显示了为什么发生错误的讯息内容

透过validationcontext的验证方式,除了可以很快的完成模型资料的合法性验证外,也可以大量的减少撰写验证资料的程式码,提升程式效率与开发速度

范例程式下载
https://github.com/madukapai/maduka-webapi