顯示具有 驗證 標籤的文章。 顯示所有文章
顯示具有 驗證 標籤的文章。 顯示所有文章

2018年5月18日 星期五

[ASP.NET MVC] 05-1 驗證 Validation(正式課程的影片)



[舊學員回娘家] 免費 四天 ASP.NET MVC影片 給您觀賞

https://mis2000lab.blogspot.tw/2018/05/aspnet-mvc_28.html

之前上過課的學員(不分實體教室上課、或遠距教學)
只要回信,我就給您四天 "免費'" 的ASP.NET MVC影片(課程)

https://mis2000lab.blogspot.tw/2018/05/aspnet-mvc_28.html

2018年5月17日 星期四

ASP.NET MVC 日期區間 & 日期範圍的驗證 

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



2016年12月5日 星期一

asp.net - 驗證控制項 -- RadioButtonList +TextBox 雙重驗證?

asp.net - 驗證控制項 -- RadioButtonList +TextBox 雙重驗證?

dotblogs.com.tw/mis2000lab/2016/10/16/validator_radiobuttonlist_textbox_20161016



一個RadioButtonList , 選項分別是A和B
下方還有一個TextBox,
當選擇A時, 若TextBox無輸入任何值,可以放行
但選擇B時, 如果TextBox是無輸入任何值,則進行驗證(必填)

今天在論壇上看見的問題  不知道我這樣的解法行不行?
Q: 一個RadioButtonList , 選項分別是A和B
下方還有一個TextBox,
當選擇A時, 若TextBox無輸入任何值,可以放行
但選擇B時, 如果TextBox是無輸入任何值,則進行驗證(必填)
===================================================




.ASPX 畫面檔
        AutoPostBack="True"
OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged">
            A
            B
       
       

       
       

        RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="必填欄位">
       

       

       

後置程式碼
    protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if(RadioButtonList1.SelectedValue == "A")
        {
            RequiredFieldValidator1.Enabled = false;
        }
        else
        {
            RequiredFieldValidator1.Enabled = true;
        }
    }

驗證(防呆)的話,最好還是透過 "前端程式" 來驗證,比較節省資源



 
 
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
寫信給我--  mis2000lab (at) yahoo.com.台灣  或是  school (at) mis2000lab.net
................   facebook社團   https://www.facebook.com/mis2000lab   ......................
................   Google+   https://plus.google.com/100202398389206570368/posts ........
................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
......................................................................................................................................................

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!微軟MVP --MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課。