前兩節我們都是針對欄位進行資料驗證
那如果我們要進行多個欄位之間的資料驗證該怎麼做呢?
其實我們驗證標籤不是只能放在欄位的上方,也可以放在類別的上方,如此作用範圍就是類別內的欄位
那今天要來做開始跟結束日期的比較,就是開始日期不可以大於結束日期
首先我們一樣先自訂一個驗證標籤StartAndEndAttribute.cs
public class StartAndEndAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var dto = (NewsCreateDto)value;
if (dto.StartDateTime > dto.EndDateTime)
{
return new ValidationResult("開始日期不可大於結束日期");
}
return ValidationResult.Success;
}
}
這邊我們要接到的值就是整個類別的範圍(NewsCreateDto)value
接著就可以進行欄位之間的比較了,如果開始日期大於結束日期,我們就回傳錯誤提示
接著就可以把標籤放入NewsCreateDto
[StartAndEnd]
public class NewsCreateDto
{
[NewsTitle]
[Required(ErrorMessage = "標題不可為空")]
public string Title { get; set; }
}
執行一下程式,當開始日期大於結束日期,上面就會跳出提示訊息

就這麼簡單,不過如果放到同樣有開始跟結束日期的NewsEditDto,就會發生錯誤
所以這邊我們可以投機用dynamic,當然有更漂亮的寫法使用介面或抽象化,不過這有機會再說
var dto = (dynamic)value;
接著順便來講一下,如何向內建範例那樣ErrorMessage傳值進去
[Required(ErrorMessage = "標題不可為空")]
首先我們可以在自訂標籤那加個屬性即可public string Value = "Test";
public class StartAndEndAttribute : ValidationAttribute
{
public string Value = "Test";
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var dto = (dynamic)value;
if (dto.StartDateTime > dto.EndDateTime)
{
return new ValidationResult("開始日期不可大於結束日期" + Value);
}
return ValidationResult.Success;
}
}
如此就可以從標籤處傳值進來
[StartAndEnd(Value = "'這是傳值'")]
public class NewsEditDto
{
public Guid id { get; set; }
public Guid NewsId { get; set; }
}

如此即可正確的傳值進去。
範例檔:下載