簡單的說,因為 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

 

ASP.NET MVC 第一天 5.5小時 完整教學影片,免費觀賞

請看  http://mis2000lab.pixnet.net/blog/post/35141956

 

 

完整影片大綱,可以參閱  ASP.NET MVC 線上教學影片、線上教程(第一天 "免費"觀賞,5.5小時)

http://mis2000lab.pixnet.net/blog/post/35172535

 

第一天,5.5小時的影片(完整內容),免費讓您評估

不用客氣。

註冊完 https://vimeo.com/ 的會員(免費帳號),就寫信跟我登記吧!

 

請把下圖的資訊,告訴我!

一律透過 E-Mail報名。謝謝您     mis2000lab (at) yahoo.com.tw  或是  school (at) mis2000lab.net

 

Vimeo_05.jpg

 

 

文章標籤
創作者介紹
創作者 MIS2000 Lab 的頭像
MIS2000 Lab

MIS2000 Lab -- ASP.NET專題實務 / 線上教學文件

MIS2000 Lab 發表在 痞客邦 留言(0) 人氣()