校驗介紹
一個應(yīng)用的輸入應(yīng)該首先要驗證椎木。這個輸入可以是用戶的輸入,也可以是另一個應(yīng)用的輸入朝卒。在一個Web應(yīng)用中目尖,驗證通常要實現(xiàn)2次:第一次是客戶端驗證,第二次是服務(wù)端驗證扎运∩客戶端的驗證是為了更好的用戶體驗,通過檢測表單的字段來提醒用戶必須的字段豪治;服務(wù)端的驗證是更嚴(yán)格且無法避免的洞拨。
服務(wù)端的驗證是在應(yīng)用服務(wù)層實現(xiàn)的。應(yīng)用服務(wù)方法應(yīng)該首先檢查(驗證)輸入然后在使用负拟。ABP提供了一個不錯的基礎(chǔ)設(shè)施來驗證應(yīng)用服務(wù)方法的輸入烦衣。
基礎(chǔ)驗證
查看模板創(chuàng)建的dto中可以看見如下的內(nèi)容,其中Required和StringLength都繼承于ValidationAttribute類,如果我們需要自定義這樣公用的驗證方式花吟,也可以自己繼承這個類秸歧,并引用。
public class RoleDto : EntityDto<int>
{
[Required]
[StringLength(AbpRoleBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpRoleBase.MaxDisplayNameLength)]
public string DisplayName { get; set; }
public string NormalizedName { get; set; }
[StringLength(Role.MaxDescriptionLength)]
public string Description { get; set; }
public bool IsStatic { get; set; }
public List<string> Permissions { get; set; }
}
我們自己定義的dto也可以直接使用如下:
public class UpdateNoteDto : EntityDto<int>
{
/// <summary>
/// 標(biāo)題
/// </summary>
public string Title { get; set; }
/// <summary>
/// 內(nèi)容
/// </summary>
[Required]
public string Content { get; set; }
/// <summary>
/// 上次修改時間
/// </summary>
public DateTime? LastModificationTime { get; set; }
}
測試一下衅澈,在Swagger UI 中:
api發(fā)送的內(nèi)容
收到的回復(fù)
自定義驗證
對于特殊的邏輯键菱,我們只在這個功能中驗證數(shù)據(jù),別的地方用不到今布,我們也可以實現(xiàn)ICustomValidate接口類自定義驗證:
public class PublicNoteDto: UpdateNoteDto,ICustomValidate
{
/// <summary>
/// 簡單描述经备,用于微信推送時的描述或者其他
/// </summary>
public string Des { get; set; }
/// <summary>
/// 封面圖片,可用于微信推送時或者其他
/// </summary>
[Required]
public string Img { get; set; }
/// <summary>
/// 關(guān)鍵字部默,可用于搜索侵蒙,分類等
/// </summary>
public string Tags { get; set; }
/// <summary>
/// 是否發(fā)布
/// </summary>
public bool IsPublic { get; set; }
public void AddValidationErrors(CustomValidationContext context)
{
if (string.IsNullOrEmpty(Des))
{
string error = "描述不能為空!";
context.Results.Add(new ValidationResult(error));
}
if (Des.Length < 10)
{
string error = "描述不能少于10個字傅蹂!";
context.Results.Add(new ValidationResult(error));
}
if (Des.Length > 200)
{
string error = "描述不能大于200個字纷闺!";
context.Results.Add(new ValidationResult(error));
}
}
}
api發(fā)送的內(nèi)容
收到的回復(fù)
標(biāo)準(zhǔn)化
標(biāo)準(zhǔn)化就是在驗證之后,進(jìn)行一些額外的操作份蝴。
具有Normalize方法的IShouldNormalize接口急但。如果實現(xiàn)了這個接口,Normalize方法就會在驗證之后調(diào)用搞乏。
public class CreateNoteDto : IShouldNormalize
{
/// <summary>
/// 創(chuàng)建時間
/// </summary>
public DateTime? CreationTime { get; set; }
/// <summary>
/// 創(chuàng)建人
/// </summary>
public long CreatorUserId { get; set; }
/// <summary>
/// 內(nèi)容的數(shù)據(jù)類型 markdown內(nèi)容波桩,html內(nèi)容,或者其他
/// </summary>
public int TextType { get; set; }
public void Normalize()
{
CreationTime = DateTime.Now;
}
}
api發(fā)送的內(nèi)容
我們service收到的數(shù)據(jù)