[C#][ASP.NET] Validation Control 資料驗證範例

[C#][ASP.NET]  Validation DropdownList FileUpload sample

本文主要自己記錄幾個常用的資料驗證模式。雖然現在很多都改用JavaScript的方式處理,但是ASP.NET中的驗證控制項,也很好用。

因為很常用!! 這裡實作幾個例子,讓自己記錄一下。有下拉選單,跟上傳檔案、還有自訂認證的方式。

通常資料的驗證分為前端與後端驗證,利用驗證來確保資料輸入時的正確性。

ASP有以下幾種驗證方式:

CompareValidator 使用比較運算子,將使用者的資料與固定數值相比。也可以與相同網頁內其他控制項的屬性數值相比。
CustomValidator 利用程式定義之驗證邏輯來檢查使用者資料的正確性。當其他的驗證元件無法執行所需的驗證,以及當你想要使用自訂的程式碼來驗證輸入的時候,便可以使用這個驗證元件。
RangeValidator 確保使用者的資料落在指定的範圍內。上限和下限可以數字、字串或日期加以表示。
RegularExpressionValidator 使用規則運算式所定義的樣式來驗證使用者的資料。
RequiredFieldValidator 確保使用者為必要欄位填入數值。

ValidationSummary  這個控制項本身並未執行驗證工作,它只會顯示一個文字標籤,用來總結網頁上的所有驗證錯誤訊息。

範例只有用到 RegularExpressionValidator、RequiredFieldValidator、CustomValidator  還有ValidationSummary

首先建立一個aspx的頁面

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Validation.aspx.cs" Inherits="Validation" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table>
                <tr>
                    <td>
                        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="請輸入日期" ValidationGroup="VG1" Display="None"></asp:RequiredFieldValidator>
                        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="日期格式錯誤(yyyymmdd)"
                            ValidationExpression="^(19|20)\d\d(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])$" ValidationGroup="VG1" Display="None"></asp:RegularExpressionValidator>
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="DropDownList1" runat="server" ErrorMessage="選單項目未選擇"
                            InitialValue="0" ValidationGroup="VG1" Display="None"></asp:RequiredFieldValidator>
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:FileUpload ID="FileUpload1" runat="server" />
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="FileUpload1" ErrorMessage="請選擇檔案" ValidationGroup="VG1" Display="None"></asp:RequiredFieldValidator>
                        <asp:CustomValidator ID="CustomValidator2" runat="server" ControlToValidate="FileUpload1" ErrorMessage="檔案已經存在"
                            OnServerValidate="CustomValidator2_ServerValidate" ValidationGroup="VG1" Display="None"></asp:CustomValidator>
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="VG1" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" ValidationGroup="VG1" />
                    </td>
                </tr>

            </table>
        </div>
    </form>
</body>
</html>

這裡利用到幾個屬性的設定:

  1. 為了讓使用者在驗證時,可以有直接區域可以瀏覽,所以用了ValidationSummary,並設定一個驗證的群組 ValidationGroup="VG1"
  2. 因為用了ValidationSummary,所以一般顯示錯誤訊息的部分,也將屬性設定為 Display="None" 
  3. 下拉選單的部分,為了讓使用者要有選擇,所以在綁定資料時,有加上1組Value = 0 ,Text ="請選擇" 的資料,並在前端網頁設定 InitialValue="0" ,讓除了0以外的值,才會被驗證通過。

.cs 頁面內容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Validation : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ddl_list();
    }

    protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
    {
        //假設上傳的檔案名稱 == 123.pdf
        if (FileUpload1.FileName == "123.pdf")
        {
            //驗證不通過
            args.IsValid = false;
        }
        else
        {
            //驗證通過
            args.IsValid = true;
        }

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)//在Click事件中透過Page.IsValid即可取得伺服器端的驗證結果,很重要一定要加。
        {
            ShowMsg("OK");
        }
    }

    //建立下拉選單
    protected void ddl_list()
    {
        for (var i = 1; i <= 3; i++)
        {
            var item = new ListItem
            {
                Text = "選單" + i.ToString(),
                Value = i.ToString()
            };
            DropDownList1.Items.Add(item);
        }
        DropDownList1.Items.Insert(0, new ListItem("請選擇", "0"));
    }

    protected void ShowMsg(string msg)
    {
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "Msg", "alert('" + msg + "');", true);
    }
}

自訂認證其實是可以處理很多的特殊項目,就看自己怎麼發揮嚕!!!

相關各種驗證的屬性資料可以參閱 余小章 @ 大內殿堂 中的資料,裡面寫得非常詳細(所以我就偷懶..放上連結嚕)。

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。