天天看點

【接口驗證】特性驗證參數

介紹:

在我們實際項目中會經常進行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

本文版權歸作者和部落格園共有,歡迎轉載,轉載請标明出處。如果您覺得本篇博文對您有所收獲,覺得小弟還算用心,請點選右下角的 [推薦],謝謝!