WebApi数据验证——编写自定义数据注解(Data Annotations)
生活随笔
收集整理的這篇文章主要介紹了
WebApi数据验证——编写自定义数据注解(Data Annotations)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
配合ModelState使用,關(guān)于使用方法,參考微軟文檔
https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api
自定義Data Annotations只需要繼承ValidationAttribute,并且重寫IsValid方法。
示例:
// =================================================================== // ModelState自定義注解 // 多個字段分組判斷,全部不允許為空或至少有一個不為空 //==================================================================== // CreateTime:2019-04-24 // Author:liucx // =================================================================== using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks;namespace OF.Component.Model {/// <summary>/// 多個屬性字段分組不為空判斷 傳入?yún)?shù)逗號間隔/// <example>[GroupEmpty("p1,p2,p3",false,ErrorMessage="p1p2p3三個參數(shù)中至少有一個非空")] </example>/// </summary>public class GroupEmptyAttribute : ValidationAttribute{private readonly string _groupFields;private readonly bool _notNullableAll;/// <summary>/// 構(gòu)造函數(shù)/// </summary>/// <param name="groupFields">屬性名,多個屬性名逗號隔開</param>/// <param name="notNullableAll"> true全部不允許為空。 false只要存在不為空的屬性即可</param>public GroupEmptyAttribute(string groupFields, bool notNullableAll){_groupFields = groupFields;_notNullableAll = notNullableAll;}/// <summary>/// 構(gòu)造函數(shù),默認至少1個非空/// </summary>/// <param name="groupFields">屬性名,多個屬性名逗號隔開</param>public GroupEmptyAttribute(string groupFields){_groupFields = groupFields;_notNullableAll = false;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){var validateResult = false;var obj = validationContext.ObjectInstance;Type Ts = obj.GetType();var fields = _groupFields.Split(',');if (fields.Count() > 0){for (var i = 0; i < fields.Count(); i++){var filedName = Convert.ToString(fields[i]);if (string.IsNullOrEmpty(filedName)) continue;//valuestring filedValue = Convert.ToString(Ts.GetProperty(filedName).GetValue(obj, null));//_notNullableAll=true,任意一個為空直接驗證掛掉跳出循環(huán)if (_notNullableAll && string.IsNullOrWhiteSpace(filedValue)){validateResult = false;break;}//_notNullableAll=false,只要有一個不為空就可以過驗證if (!_notNullableAll && !string.IsNullOrWhiteSpace(filedValue)){validateResult = true;break;}}}//successif (validateResult)return ValidationResult.Success;else{//failif (string.IsNullOrEmpty(ErrorMessage) && _notNullableAll)return new ValidationResult($"{_groupFields}字段全部不允許為空值");else if (string.IsNullOrEmpty(ErrorMessage) && !_notNullableAll)return new ValidationResult($"{_groupFields}字段中至少要有一個不為空的值");elsereturn new ValidationResult(ErrorMessage);}}}/// <summary>/// 組內(nèi)數(shù)據(jù)同步判斷,同時為空或同時不為空通過驗證/// </summary>public class GroupEmptySyncAttribute : ValidationAttribute{private readonly string _groupFields;public GroupEmptySyncAttribute(string groupFields){_groupFields = groupFields;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){var validateResult = true;var obj = validationContext.ObjectInstance;Type Ts = obj.GetType();var fields = _groupFields.Split(',');if (fields.Count() > 0){bool firstValueIsEmpty = true;//第一個值是否為空for (var i = 0; i < fields.Count(); i++){var filedName = Convert.ToString(fields[i]);if (string.IsNullOrEmpty(filedName)) continue;//valuestring filedValue = Convert.ToString(Ts.GetProperty(filedName).GetValue(obj, null));//第一個值記錄是否為空if (i == 0 && string.IsNullOrWhiteSpace(filedValue))firstValueIsEmpty = true;if (i == 0 && !string.IsNullOrWhiteSpace(filedValue))firstValueIsEmpty = false;//后續(xù)值判斷是否和第一個值符合,不符合直接結(jié)束驗證if (i > 0){if (string.IsNullOrWhiteSpace(filedValue) != firstValueIsEmpty){validateResult = false;break;}}}}//successif (validateResult)return ValidationResult.Success;else{//failif (string.IsNullOrEmpty(ErrorMessage))return new ValidationResult($"{_groupFields}字段是否為空不一致(必須同時為空或同時不為空)");elsereturn new ValidationResult(ErrorMessage);}}}/// <summary>/// 判斷時間格式是否對應(yīng),時間格式一致通過驗證/// </summary>public class DateFormatValidAttribute : ValidationAttribute{private readonly string _formatStr;public DateFormatValidAttribute(string formatStr){_formatStr = formatStr;}protected override ValidationResult IsValid(object value, ValidationContext validationContext){var validateResult = false;try{//轉(zhuǎn)成要求的格式后 再和傳入的值對比var formatValue = Convert.ToDateTime((string)value).ToString(_formatStr);if ((string)value == formatValue)validateResult = true;elsevalidateResult = false;//successif (validateResult)return ValidationResult.Success;else{//failif (string.IsNullOrEmpty(ErrorMessage))return new ValidationResult($"時間格式不符合{_formatStr}格式");elsereturn new ValidationResult(ErrorMessage);}}catch (Exception ex){if (string.IsNullOrEmpty(ErrorMessage))return new ValidationResult($"時間格式不符合{_formatStr}格式");elsereturn new ValidationResult(ErrorMessage);}}} }使用:
測試結(jié)果:
轉(zhuǎn)載于:https://my.oschina.net/CrazyBoy1024/blog/3042984
總結(jié)
以上是生活随笔為你收集整理的WebApi数据验证——编写自定义数据注解(Data Annotations)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node02
- 下一篇: 修改Docker容器字符编码为-zh_C