簡單的說,因為 jQuery版本異動,所以 ASP.NET MVC這個驗證不會動。
[Range(typeof(DateTime) , .......] //日期區間 & 日期範圍的驗證
請看下面第二篇文章(超連結)的說明
Note: jQuery validation does not work with the Range attribute and DateTime. For example, the following code will always display a client side validation error, even when the date is in the specified range:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
You will need to disable jQuery date validation to use the Range attribute with DateTime. It's generally not a good practice to compile hard dates in your models, so using the Range attribute and DateTime is discouraged.
有三種解法:
第一,前端驗證,透過 JavaScript或 jQuery來做
直接複製貼上,微調後就能使用,這是最簡單的作法(詳見下面 第二點解法 的文章超連結)
第二,自訂驗證(Custom Validatiion)屬性
自己寫一個類別檔來做
protected
override ValidationResult
IsValid(object value, ValidationContext validationContext)
就能搭配 [MyValidateDateRange(MyStartDate = "1/1/1950", MyEndDate = "1/1/2025", ErrorMessage = ".....")]
請看 https://stackoverflow.com/questions/27182606/asp-mvc-5-client-validation-for-range-of-datetimes
第三,自訂驗證模型(
IValidatableObject)
把驗證規則,寫在對應這個資料表的類別檔裡面
請看 https://stackoverflow.com/questions/21777412/mvc-model-validation-for-date
很巧的是:有兩篇 好文章 剛好解決了上面四件事,
包含:說明了「jQuery版本異動,導致日期區間的驗證失效」這件事
上述的第二個解法,我測試過,不會動,
可能年代相隔了一陣子,有些異動。
所以提供
我微調後,會動的範例。如下:
== Models目錄底下的 UserTable.cs ==
需要驗證的資料表欄位(名為UserBirthDay,也是這個類別的屬性)
[Display(Name = "生日(UserBirthDay)")]
[DataType(DataType.Date)]
// *** 因為 jQuery改版,後續變成有問題 ***
// 設定日期區間(月/日/年)的驗證
//[Range(typeof(DateTime), "1/1/1950", "1/1/2025" ,ErrorMessage = "日期區間,只能在1950年以後~2025年之前")]
// *** 自訂驗證 Custom Validation 屬性 ***
[MyValidateDateRange(MyStartDate = "1/1/1950", MyEndDate = "1/1/2025", ErrorMessage = "日期區間,只能在1950年以後~2025年之前")]
public DateTime UserBirthDay { get; set; }
== Models目錄底下,自己加入一個類別檔 ==
(1) 建議檔名的末端,使用 Attribute字樣
(2) 最上方,加入命名空間。
using System.ComponentModel.DataAnnotations;
(3) public class MyValidateDateRangeAttribute
: ValidationAttribute
您的類別名稱後面加上「 : ValidationAttribute 」
(4)
public string MyStartDate { get; set; }
public string MyEndDate { get; set; }
(5)
protected
override ValidationResult
IsValid(object value, ValidationContext validationContext)
{
// https://msdn.microsoft.com/zh-tw/library/dd730022(v=vs.110).aspx
//參數 (1) value : System.Object 要驗證的值。 (2) validationContext : 驗證作業的相關內容資訊。
//傳回值 : ValidationResult 類別的執行個體。
DateTime dt = (DateTime)value;
// 日期區間(起迄日)
if (dt >= Convert.ToDateTime(MyStartDate) && dt <= Convert.ToDateTime(MyEndDate))
{
return ValidationResult.Success;
// 驗證成功
}
else
{
// 第一種作法,驗證失敗會出現這一句錯誤訊息。
//return new ValidationResult("[自訂驗證 的 錯誤訊息] 抱歉~日期區間,不符合或超出範圍");
//第二種作法,這裡使用空字串。驗證失敗就會使用 [ ErrorMessage=""]這裡的錯誤訊息
return new ValidationResult("");
}
}
萬分感激 Saket 大大 他的說明淺顯易懂,一次提供兩種解法
如果您可以登入的話,請別忘了給他 按讚! 鼓勵他無私的貢獻
請看 https://stackoverflow.com/questions/27182606/asp-mvc-5-client-validation-for-range-of-datetimes