1. 程式人生 > >驗證資料傳輸物件

驗證資料傳輸物件

文件目錄

本節內容:

簡介

一個應用的輸入應當先要驗證,這個輸入可能來自使用者或另一個應用,在一個web應用裡,驗證通常實現兩次:在客戶端和在服務端,客戶端驗證是為了使用者體驗,最好是先檢查一個表單並向用戶顯示無效的輸入,但是服務端的驗證更具有決定性意義和必要性。

服務端驗證通常實現在應用服務或控制器(通常,所有服務從展現層獲取資料)。一個應用服務應該先檢查(驗證)輸入然後再使用它。ABP提供了一個基礎構造,自動驗證一個應用的如下三個的所有輸入:

如果需要禁用驗證,請檢視“禁用驗證”小節。

使用資料註解

ABP支援資料註解特性,假設我們正在開發一個Task應用服務,它用來建立一個Task並需要一個輸入,如下所示:

public class CreateTaskInput
{
    public int? AssignedPersonId { get; set; }

    [Required]
    public string Description { get; set; }
}

這裡的Description屬性被標記為Required,AssingedPersonId是可選的,在System.ComponentModel.DataAnnotations名稱空間裡,還有很多特性(如MaxLength、MinLenggth、RegularExpression...)。下面為Task

應用服務的實現:

public class TaskAppService : ITaskAppService
{
    private readonly ITaskRepository _taskRepository;
    private readonly IPersonRepository _personRepository;

    public TaskAppService(ITaskRepository taskRepository, IPersonRepository personRepository)
    {
        _taskRepository 
= taskRepository; _personRepository = personRepository; } public void CreateTask(CreateTaskInput input) { var task = new Task { Description = input.Description }; if (input.AssignedPersonId.HasValue) { task.AssignedPerson = _personRepository.Load(input.AssignedPersonId.Value); } _taskRepository.Insert(task); } }

就像你看到的,沒有寫驗證程式碼,因為ABP自動完成驗證。ABP會驗證如果輸入為null,就丟擲AbpValidationException,所以你不需要寫null檢查。如果輸入的任何屬性是無效的,它也會丟擲AbpValidationException。

這種機制類似於Asp.net Mvc的驗證,但請注意一個應用服務類不是從控制器繼承過來,它就是一個單純的類,甚至可以在一個web應用以外使用該類。

自定義驗證

如果資料註解不夠你用,你可以實現ICustomValidate介面,如下所示:

public class CreateTaskInput : ICustomValidate
{
    public int? AssignedPersonId { get; set; }

    public bool SendEmailToAssignedPerson { get; set; }

    [Required]
    public string Description { get; set; }

    public void AddValidationErrors(CustomValidatationContext context)
    {
        if (SendEmailToAssignedPerson && (!AssignedPersonId.HasValue || AssignedPersonId.Value <= 0))
        {
            context.Results.Add(new ValidationResult("AssignedPersonId must be set if SendEmailToAssignedPerson is true!"));
        }
    }
}

ICustomValidate介面定義了AddValidationErrors方法,如果有驗證錯誤,我們必須新增ValidationResult物件到context.Results列表。在驗證進度裡,如果有需要,你可以用context.IocResolver來解析依賴

除了ICustomValidate,ABP也支援IValidatableObject介面。你同樣也可以實現它,執行額外的自定義驗證。如果你同時實現了這兩個介面,這兩個都會被呼叫。

禁用驗證

對於自動驗證類(檢視“簡介”小節),你可以使用這些特性來控制驗證:

  • DisableValidation特性:可用在DTO的類,方法或屬性上來禁用驗證。
  • EnableValidation特性:在一個被禁用驗證的類裡,可以在方法上使用這個特性讓當前方法的輸入驗證可用。

正常化

有時我們需要在驗證後,執行一個額外的操作來整理DTO引數。ABP定義了IShouldNormailize介面,包含Normalize方法,如果你實現了這個介面,Normalize方法在驗證後(在方法被呼叫前)被呼叫。假設我們需要從DTO裡取得排序方向(升序、降序),如果未提供,我們想設定一個預設值:

public class GetTasksInput : IShouldNormalize
{
    public string Sorting { get; set; }

    public void Normalize()
    {
        if (string.IsNullOrWhiteSpace(Sorting))
        {
            Sorting = "Name ASC";
        }
    }
}

相關推薦

驗證資料傳輸物件

文件目錄 本節內容: 簡介 自定義驗證 禁用驗證 正常化 簡介 一個應用的輸入應當先要驗證,這個輸入可能來自使用者或另一個應用,在一個web應用裡,驗證通常實現兩次:在客戶端和在服務端,客戶端驗證是為了使用者體驗,最好是先檢查一個表單並向用戶顯示無效的輸入,但是服務端的驗證更

ABP官方文件(二十五)【資料傳輸物件驗證

4.3 ABP應用層 - 資料傳輸物件驗證 應用程式的輸入首先應該被驗證是否有效。輸入的資料能夠被使用者或者其它應用傳送。在web應用中,驗證通常被實現兩次:客戶端和伺服器端。客戶端驗證的實現主要用於使用者體驗。首先,最好是在客戶端檢驗表單並且向用戶展示無效的

資料傳輸物件的作用

  在DDD領域驅動開發中會用到資料傳輸物件(Data Transfer Objects),下面是對資料傳輸物件作用的總結 1、抽象領域層     在展現層中資料傳輸物件對領域物件進行了有效的抽象。這樣你的層(layers)將被恰當的隔離開來。甚至當你想要完全替換展現層時,你還可以繼續使用已經存在的應用層

從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之十二 || 三種跨域方式比較,DTOs(資料傳輸物件)初探

更新反饋 1、博友@童鞋說到了,Nginx反向代理實現跨域,因為我目前還沒有使用到,給忽略了,這次記錄下,為下次補充。 程式碼已上傳Github+Gitee,文末有地址   今天忙著給小夥伴們提出的問題解答,時間上沒把握好,都快下班了,趕緊釋出:書說上文《從壹開始前

後端DTO(資料傳輸物件)與DO(資料庫資料來源物件)解耦的好處

我們在後端的開發中經常會將DO物件傳到Service層直接作為DTO傳給前端,這樣做其實會有很多弊端。 (一)DO物件一般其成員域和資料庫欄位是對應的,所以不能新增額外的欄位,但是有時候端就是需要這個欄位。反之前端要向後端傳一些額外的欄位,DO也沒辦法接受,前端的Form表單不可能和資料庫共

應用程式框架實戰三十四:資料傳輸物件(DTO)介紹及各型別實體比較

using System.ComponentModel.DataAnnotations; using Util; using Util.Domains.Repositories; namespace Biz.Security.Domains.Queries { /// <summar

資料傳輸物件模式【其他模式】

資料傳輸物件模式 public class DataTransferObject { /** * Data Transfer Object Pattern【資料傳輸物件模式】: * 將相關的資料一次性加載出來,避免客戶端多次獨立呼叫,提高傳輸效率。 */

ABP(現代ASP.NET樣板開發框架)系列之16、ABP應用層——資料傳輸物件(DTOs)

基於DDD的現代ASP.NET開發框架--ABP系列之16、ABP應用層——資料傳輸物件(DTOs) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 資料傳輸物件(Data Transfer Objects)用於應用層

ABP官方文件(二十四)【資料傳輸物件

4.2 ABP應用層 - 資料傳輸物件 資料傳輸物件(Data Transfer Objects)用於應用層和展現層的資料傳輸。 展現層傳入資料傳輸物件(DTO)呼叫一個應用服務方法,接著應用服務通過領域物件執行一些特定的業務邏輯並且返回DTO給展現層。這樣

VO(檢視模型) 與 DTO(資料傳輸物件)的區別

目錄 VO(檢視模型) 與 DTO(資料傳輸物件)的區別 1.VO與DTO概念 2.VO 檢視模型的必要性與解耦 2.1 檢視模型 2.2 檢視模型存在的必要性 2.3 檢視模

【Django Series - 04】資料的增刪改:使用者提交資料驗證資料的有效性並傳輸至後臺(jQuery.post)

Django Series(Django2.1.2 + Anaconda3) (一)安裝並配置 Django 環境 ||| 基於 Django 進行 Web 開發 (二)Django 基礎知識:語法、教程 (三)使用者管理模組:建立使用者、登入、退出 (四)資料的增刪改:使用者提交資

04】資料的增刪改:使用者提交資料驗證資料的有效性並傳輸至後臺(jQuery.post)

Django Series(Django2.1.2 + Anaconda3) 說明:本系列教程根據最近實踐過程進行整理、總結和分享。由於時間和精力有限,發表時內容分析部分可能不是很完整,後續有時間會慢慢補充。同時!!也希望感興趣的同學可以提出一些細節問題

【android安全】之使用ssl驗證保護網路資料傳輸安全。

package com.test; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.i

Java NIO教程(五) 通道之間的資料傳輸

                                 Java NIO教程(五) 通道之間的資料傳輸

Vue 頁面狀態保持頁面間資料傳輸的一種方法

如果大家覺得有用,更多的模組請點選檢視 vue router給我們提供了兩種頁面間傳遞引數的方式: 動態路由匹配 程式設計式的導航 // 命名的路由 router.push({ name: 'user', params: { userId: 123 }}) // 帶查詢引數,變成 /re

用Vue來進行移動Hybrid開發和客戶端間資料傳輸的一種方法

如果大家覺得有用,更多的模組請點選檢視 即上一篇Vue 頁面狀態保持頁面間資料傳輸的一種方法,今天我們說說我們團隊是怎麼和客戶端進行互動。 為什麼到了今天,還要提hybrid開發,就我所在團隊從中獲得的好處有: 團隊較小、業務較重、迭代頻繁、需要緊急響應的團隊和專案比較適合用 使用單頁應用技術

C語言小結--float short等非char型資料傳輸問題

1.問題描述 最近開發中需要使用can傳輸float和short型資料,我們知道一般的嵌入式平臺的通訊埠如CAN、串列埠、網路等都是以位元組(byte)為單位傳輸的,那麼怎麼傳輸float、short等型別的資料呢?尤其是帶符號位的資料。 2.解決思路 使用共用體(union

javascript頁面驗證資料的合法性

javascript頁面驗證資料的合法性 <script language="javascript"> function on_submit() { //驗證資料的合法性 if (form1.username.value == "") { alert("使用者名稱不能為空

6.5(java學習筆記)其他流(位元組陣列流,資料流,物件流,列印流)

一、位元組陣列流   之前使用輸入輸出流的操作的物件是檔案,而這裡位元組陣列流操作的物件是記憶體,記憶體可以看做是一個位元組陣列。   使用位元組陣列流讀寫就可以看做是從記憶體A到記憶體B的讀寫,物件時記憶體即位元組陣列。      1.1構造方法     ByteArrayOutputStream

【Java TCP/IP Socket程式設計】----深入剖析----TCP資料傳輸中的死鎖和效能

目錄   死鎖問題 資料傳輸效能 案例 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 死鎖問題 在TCP資料傳輸底層實現中(詳細參見https://blog.csdn.net/lili13897741554/article/