Web Api 模型驗證

来源:http://www.cnblogs.com/ywolf123/archive/2016/04/07/ValidateModelInWebApi.html
-Advertisement-
Play Games

1.模型建立,在模型上類上添加System.ComponentModel.DataAnnotations驗證屬性 ~~~C public class Product { public int Id { get; set; } [Required] public string Name { get; ...


1.模型建立,在模型上類上添加System.ComponentModel.DataAnnotations驗證屬性

public class Product
{
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public decimal Price { get; set; }
        [Range(0, 999)]
        public double Weight { get; set; }
}

2.在ApiController類中使用驗證結果

 public HttpResponseMessage Post(Product product)
        {
            if (ModelState.IsValid)
            {
                // Do something with the product (not shown).

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }

3.客戶端調用並處理驗證出錯信息

 static async Task RunAsync()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:57332/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

              
                // HTTP POST
                var gizmo = new Product() { Name = "Gizmo", Price = 100, Weight = -200 };
                HttpResponseMessage response = await client.PostAsJsonAsync("api/Product", gizmo);

                if (response.IsSuccessStatusCode)
                {
                    // Get the URI of the created resource.
                    Uri gizmoUrl = response.Headers.Location;
                    Console.WriteLine("Post OK!");
                }
                else if (response.StatusCode == HttpStatusCode.BadRequest)
                {                   
                    var x = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(x); //輸出出錯信息
                
                }
            }
        }

4.利用Filter Attribute來統一處理驗證出錯信息

建立Filter類

 public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid == false)
            {
                actionContext.Response = actionContext.Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, actionContext.ModelState);
            }
        }

在WebApiConfig.cs中添加如下代碼

public static void Register(HttpConfiguration config)
{
            
      config.Filters.Add(new ValidateModelAttribute()); //將這行代碼添加進去
 }

這樣action中就可以直接寫驗證通過後的業務邏輯了,在每個action不需要單獨使用 if (ModelState.IsValid)方法來判斷了,代碼變得簡潔明瞭

 [ValidateModel]
    public HttpResponseMessage Post(Product product)
    {
         // Do something with the product (not shown).

                return new HttpResponseMessage(HttpStatusCode.OK);
    }

5.驗證效果

響應信息

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Pragma: no-cache
  X-SourceFiles: =?UTF-8?B?ZDpcbXkgZG9jdW1lbnRzXHZpc3VhbCBzdHVkaW8gMjAxM1xQcm9qZWN0c1xNb2RlbFZhbGlkYXRpb25EZW1vXE1vZGVsVmFsaWRhdGlvbkRlbW9cYXBpXFByb2R1Y3Q=?=
  Cache-Control: no-cache
  Date: Thu, 07 Apr 2016 14:12:21 GMT
  Server: Microsoft-IIS/8.0
  X-AspNet-Version: 4.0.30319
  X-Powered-By: ASP.NET
  Content-Length: 109
  Content-Type: application/json; charset=utf-8
  Expires: -1
}}

返回XML類型出錯信息

返回json格式數據

{"Message":"請求無效。","ModelState":{"product.Weight":["欄位 Weight 必須在 0 和 999 之間。"]}}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • VMware下,centos系統,安裝好後,一直連不上外網。在網上查了好多資料,都沒有找到解決的辦法。最後,把自己的解決方案,寫到下麵。 第一步、打開文件 $ vim /etc/sysconfig/network-scripts/ifcfg-eth0 #自動獲取DEVICE=eth0BOOTPROT ...
  • 安裝php yum install php yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc yum install php yum install php-mysql php-gd ...
  • 作為本系列博文的開篇,有必要先做些聲明,用於免責、以絕口水: 1. 博文僅圍繞已經棄用的、C/S結構的《上海市個人非營業性客車額度競拍程式》客戶端(NetBidClient)進行介紹,對於正在使用的系統不進行任何討論。 2. 作者從未向“代拍黃牛”提供過任何技術支持或外掛軟體,也沒有依賴相關技術從事 ...
  • 有一段時間沒有接著微信的主題繼續介紹裡面的功能模塊了,這段時間來,微信也做了不少的變化改動,針對這些特性我全面核對了一下相關的微信公眾號和企業號的介面,對原有的微信API和系統管理做了全面的更新,本隨筆以及後面的隨筆就是基於這個工作上的總結,以期把微信涉及的功能模塊,都使用C#實現的方式來介紹。本隨 ...
  • 研究ing 待續。。。 ...
  • 前言 本文主要來學習記錄前三個建議。 建議1、正確操作字元串 建議2、使用預設轉型方法 建議3、區別對待強制轉換與as和is 其中有很多需要理解的東西,有些地方可能理解的不太到位,還望指正。 建議1、正確操作字元串 字元串應該是所有編程語言中使用最頻繁的一種基礎數據類型。如果使用不慎,我們就會為一次 ...
  • 前段時間遇到了需要禁用刷新的需求,f5按鈕就不說了,簡單的js就能把它禁用,但是工具條上的刷新按鈕卻傻傻乾不掉。 如果簡單的在刷新時重新載入畫面,通過window.location.href="url"可以很容易的實現,但是需求是要求在刷新時什麼都不做,保留畫面的狀態,這下子可就複雜化了。 asp. ...
  • Sql Server清理緩存代碼 需要較高級別的許可權 該代碼只有在登錄sql server的用戶名具有sysadmin許可權的時候才可以使用 設置的方式:安全性=》登錄名=》登錄名右鍵=》屬性=》伺服器角色=》選項(sysadmin)=》確定 之後,代碼在代碼裡面也可以執行了! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...