7-3.ASP.NET Core MVC 入門教學 - 自訂整個類別的驗證標籤和傳值

ASP.NET Core MVC 入門教學

前兩節我們都是針對欄位進行資料驗證

那如果我們要進行多個欄位之間的資料驗證該怎麼做呢?

其實我們驗證標籤不是只能放在欄位的上方,也可以放在類別的上方,如此作用範圍就是類別內的欄位

那今天要來做開始跟結束日期的比較,就是開始日期不可以大於結束日期

首先我們一樣先自訂一個驗證標籤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; }
}

如此即可正確的傳值進去。

 

範例檔:下載




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤