您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么用ASP.NET實現參數有效性驗證”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
應用程序的輸入數據首先應該被檢驗是否有效。輸入的數據能被用戶或其他應用程序提交。在Web應用中,通常進行2次數據有效性檢驗:包括客戶端檢驗和服務端檢驗。客戶端的檢驗主要是使用戶有一個好的用戶體驗。 首先最好是在客戶端檢驗其表單輸入的有效性并且展示給客戶端的那些字段輸入是無效的。但是,服務器端的校驗是更關鍵和不可缺失的(不要只做客戶端檢驗而不做服務器端檢驗)。
服務器端的檢驗通常是被應用服務(層)執行,應用服務(層)中的方法首先檢驗數據的有效性,然后才使用這些通過驗證的數據。ABP的基礎設施提供了自動檢驗輸入數據有效性的方法。
應用服務(層)方法得到一個數據傳輸對象(DTO)作為輸入。ABP有一個IValidate的接口,DTO通過實現這個接口能夠檢驗數據的有效性。由于IInputDto擴展自IValidate,所以你可以直接實現IInputDto 接口來對數據傳輸對象(DTO)檢驗其有效性。
ABP提供數據注解的特性。假設我們正在開發一個創建任務的應用服務并且得到了一個輸入,請看下面示例:
public class CreateTaskInput : IInputDto
{
public int? AssignedPersonId { get; set; }
[Required]
public string Description { get; set; }
}
在這里,Description 屬性被標記為 Required。AssignedPersonId 是可選的。在 System.ComponentModel.DataAnnotations 命名空間中,還有很多這樣的特性 ( 例如: MaxLength, MinLength, RegularExpression 等等 )。
在System.ComponentModel.DataAnnotations 命名空間中,請看Task application service 的實現
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);
}
}
正如你所看到的,這里沒有寫任何的數據驗證性代碼(指對Description屬性的驗證)因為ABP會自動去檢驗數據的有效性。ABP也會檢驗輸入數據是否為null。如果為空則會拋出AbpValidationException 異常。所以你不需要寫檢驗數據是否為null值的代碼。如果有任何屬性的輸入數據是無效的它也會拋出相同的異常。
這個機制近似于 ASP.NET MVC 的驗證功能,注意:這里的應用服務類不是繼承自Controller,它是用在Web應用的一個普通類。
如果數據注解的方式不能滿足你的需求,你可以實現ICustomValidate接口,請看下面示例:
public class CreateTaskInput : IInputDto, ICustomValidate
{
public int? AssignedPersonId { get; set; }
public bool SendEmailToAssignedPerson { get; set; }
[Required]
public string Description { get; set; }
public void AddValidationErrors(List<ValidationResult> results)
{
if (SendEmailToAssignedPerson && (!AssignedPersonId.HasValue || AssignedPersonId.Value <= 0))
{
results.Add(new ValidationResult("AssignedPersonId must be set if SendEmailToAssignedPerson is true!"));
}
}
}
ICustomValidate 接口聲明了一個可被實現的AddValidationErrors方法。這里我們有一個叫做 SendEmailToAssignedPerson 的屬性。如果該屬性是真,AssignedPersonId 屬性會被檢驗是否有效,否則該屬性可以為空。如果有驗證錯誤,我們必須添加把這些驗證結果添加到結果集合中。(就是將ValidationResult 添加到results)
在檢驗數據有效性后,我們需要執行一個額外的操作來整理DTO參數。ABP定義了一個IShouldNormalize接口,這個接口聲明了一個 Normalize的方法。如果你實現了這個接口,在檢驗數據有效性后,Normalize方法會被調用。假設我們的DTO需要一個排序方向的數據。如果這個Sorting屬性沒有被提供數據,那么在Normalize我們可以給Sorting設置一個缺省值。
public class GetTasksInput : IInputDto, IShouldNormalize
{
public string Sorting { get; set; }
public void Normalize()
{
if (string.IsNullOrWhiteSpace(Sorting))
{
Sorting = "Name ASC";
}
}
}
“怎么用ASP.NET實現參數有效性驗證”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。