介紹:
在我們實際項目中會經常進行post,get請求這些都避免不了一些參數,有參數就有合法有效的意思。比如我一個數就想保證幾位,多了不允許,或者默寫字段不可以為空值等。以前我們都是解除安裝方法中一個一個去判斷,現在我們認識一個新朋友。
此文章不說多深就是一個簡單使用記錄,所有還請見諒,大神繞行!!!!
資料注解Data Annotations:
首先:Data Annotations是在
System.ComponentModel.DataAnnotations命名空間下:所有我們使用要先引用命名空間:
該命名空間下有很多幫助類:
!!!!!!!!!有時間補充!!!!!!
代碼示例:
首先定義參數接受類:

public class ParameClass
{
public int Id { get; set; }
[Required(ErrorMessage="請輸入姓名")]
public string Name { get; set; }
[Range(0, 10)]
public double value { get; set; }
}
View Code
我們經常使用mvc對Required特性最熟悉了,沒有錯我就是定一個name屬性為必填項,定義一個value為0-10位;Range(minimum,maximum)很好了解。
好了定義好了參數類,我們就開始定一個特性類來對參數的有效性做處理:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method , Inherited = true)]
public class ValiDateAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
下面補全一個周遊驗證的方法:

var modelState = actionContext.ModelState;
if (!modelState.IsValid)
{
string error = string.Empty;
foreach (var key in modelState.Keys)
{
var state = modelState[key];
if (state.Errors.Any())
{
error = state.Errors.First().ErrorMessage;
break;
}
}
var response = new{ Status = 404, Message = error };
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Accepted)
{
Content = new StringContent(JsonConvert.SerializeObject(response), System.Text.Encoding.GetEncoding("UTF-8"), "application/json")
};
}
這裡會引用很多命名空間引用即可,沒有别的。
配置注冊:
第一種當然是在使用的方法方面直接加特性
第二種就是全局配置:在WebApiConfig檔案的Register方法裡面注冊:
//注冊驗證
config.Filters.Add(new ValiDateAttribute());
效果:
注意:注意:注意:在webAPI中必須請求加上參數參可以看到效果,不然一直是預設值,不會驗證,還沒想到解決辦法。
好了這就是簡單使用步驟。在mvc控制器我還沒有弄,以後弄了會補上!!!!!!!
補充:2018-06-21
一些驗證規則:
Required(ErrorMessage):必須輸入值;ErrorMessage ="";用來定義傳回的說明
StringLength(value):字元長度;存在:ErrorMessage
Range(min,max):字元範圍;存在:ErrorMessage
RegularExpression:允許輸入正規表達式存在:ErrorMessage
自定義實作規則寫法:
首先肯定是要繼承:ValidationAttribute (當然也可以繼承子類)
注意:如果繼承父類,要實作自定義驗證方法,不然運作會報錯:
執行個體代碼:

public class CustomAttribute : ValidationAttribute
{
//構造函數
public CustomAttribute()
{
}
//錯誤傳回值
public override string FormatErrorMessage(string name)
{
return "隻能輸入男或者女";
}
//驗證重寫【規則】
public override bool IsValid(object value)
{
if (value.ToString() == "男" || value.ToString() == "女")
{
return true;
}
return false;
}
}
mvc移植:
在mvc中直接使用是不好使用的,因為使用的命名空間不一樣可能是,但是方法不同吧,沒細研究,我使用了一個折中的方式來實作(以後在發現在補充):
就是在mvc中我這這個方法中直接擷取參數名稱,然後對參數名稱的值取出來進行驗證,所有所有的驗證不是寫在了實體類上面,而是寫在了這個方法中:

public override void OnActionExecuting(ActionExecutingContext actionContext)
{
var parames = actionContext.ActionParameters;
foreach (var key in parames.Keys)
{
if (key == "name")
{
var state = parames[key];
if (string.IsNullOrEmpty(state.ToString()))
{
JsonResult ajaxRes = new JsonResult();
ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
ajaxRes.Data = "請輸入名稱";
actionContext.Result = ajaxRes;
}
}
if (key == "age")
{
var state = parames[key];
if ((int)state<0|| (int)state>10)
{
JsonResult ajaxRes = new JsonResult();
ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
ajaxRes.Data = "請輸入年齡0-10";
actionContext.Result = ajaxRes;
}
}
if (key == "sex")
{
var state = parames[key];
if (state.ToString() == "男" || state.ToString() == "女")
{
}
else {
JsonResult ajaxRes = new JsonResult();
ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
ajaxRes.Data = "請輸入男或者女";
actionContext.Result = ajaxRes;
}
}
}
}
這樣子就跟Data Annotations這個沒有關系了,不管怎麼樣先實作這個類似的效果僅作記錄筆記吧。使用和特新一樣用,寫在方法上面即可。
特性使用範圍補充:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method , Inherited = true)]
AttributeUsageAttribute(AttributeTargets validOn);:用指定的屬性允許多個來指定該特性适用于那些。比如類,方法,程式集。
AttributeTargets:枚舉類型,包含了AttributeUsageAttribute所運作的屬性值。
Assembly = 1:可以對程式集應用屬性
Module = 2:可以對子產品應用屬性。
Class = 4:可以對類應用屬性。
Struct = 8:可以對結構應用屬性,即值類型。
Enum = 16,可以對枚舉應用屬性
Constructor = 32:可以對構造函數應用屬性。
Method = 64:可以對方法應用屬性。
Property = 128:可以對屬性 (Property) 應用屬性 (Attribute)。
Field = 256:可以對字段應用屬性。
Event = 512:可以對事件應用屬性。
Interface = 1024,可以對接口應用屬性。
Parameter = 2048:可以對參數應用屬性。
Delegate = 4096:可以對委托應用屬性。
ReturnValue = 8192:可以對傳回值應用屬性。
GenericParameter = 16384:可以對泛型參數應用屬性。
All = 32767:可以對任何應用程式元素應用屬性。
作者:
YanBigFeg——
顔秉鋒出處:
http://www.cnblogs.com/yanbigfeg本文版權歸作者和部落格園共有,歡迎轉載,轉載請标明出處。如果您覺得本篇博文對您有所收獲,覺得小弟還算用心,請點選右下角的 [推薦],謝謝!