[.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证
在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断
若是使用ValidationContext,就可以省去很多自行撰写程式码的工作
要使用ValidationContext的验证方式很简单,我先用一个简单的例子来说明就可以呈现所需要的结果
1.首先先在专案中建立一个新的模型档案,并在模型档案中加入下面的程式码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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的参数
1
2
3
4
5
6
7
8
9
10
11
|
public class ValidController : ApiController
{ /// <summary>
/// 執行資料寫入的Post動作
/// </summary>
/// <param name="query"></param>
public Models.ValidModels.ValidInfoResult Post(Models.ValidModels.ValidInfoQuery query)
{
}
} |
3.一般传统进行输入资料验证的方式,会采用下面的方式进行验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// 傳統欄位驗證的寫法 // 驗證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进行验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// 使用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的栏位我刻意输入了不合法的内容
按下"Try it"之后,得到的结果如下图所示
可以看到,在结果的显示上,很清楚的列出"Name "与"Age"两个栏位是验证失败的,也显示了为什么发生错误的讯息内容
透过ValidationContext的验证方式,除了可以很快的完成模型资料的合法性验证外,也可以大量的减少撰写验证资料的程式码,提升程式效率与开发速度
范例程式下载
https://github.com/madukapai/maduka-WebAPI
》简单xml创建-json转xml
1 public XmlDocument createXml() { 2 XmlDocument xmlDoc = new XmlDocument(); 3 string xmlJson = @"{ 4 ""?xml"": { 5 ""@version"": ""1.0"", 6 ""@encoding"": ""gb2312"" 7 }, 8 ""weixin"": { 9 ""token"": 10 { 11 ""@Tokenstr"": ""xxxxxxxxxxxxxxx"", 12 ""@Refreshtime"": ""2016/12/12 16:49:52"" 13 }, 14 ""ticket"": 15 { 16 ""@Ticketstr"": """", 17 ""@Refreshtime"": ""2016/12/8 14:56:34"" 18 }, 19 ""cardticket"": 20 { 21 ""@Ticketstr"": """", 22 ""@Refreshtime"": ""2016/11/10 9:51:52"" 23 } 24 } 25 }"; 26 xmlDoc = JsonConvert.DeserializeXmlNode(xmlJson); 27 xmlDoc.Save(path); 28 return xmlDoc; 29 }