為什么有的時候,只需要對頁面的某些部分的輸入進行驗證呢?舉一個例子,在某些應(yīng)用中,有的時候為了用戶的輸入方便,有可能在同一個頁面中,存在多個要求用戶輸入數(shù)據(jù)和提交數(shù)據(jù)的表單(這在一些信息系統(tǒng)的后臺管理系統(tǒng)中,比較常見)。而用戶每次的一個操作,比如用戶輸入每次進貨的數(shù)量并提交,則只需要對該提交的數(shù)據(jù)進行驗證,而頁面中其他的表單,比如每次出貨的數(shù)量,由于用戶沒有填入數(shù)據(jù),則不需要對其進行校驗了,這樣也提高了應(yīng)用的效率。
下面我們來看下如何有選擇地對表單輸入進行驗證,首先全面了解下asp.net中關(guān)于輸入驗證控件的一些屬性和用法。
首先介紹的是causesvalidation屬性。如果我們不想對某個按鈕提交的事件進行驗證,只需要將causesvalidation屬性設(shè)置為false,比如,有一個”取消”按鈕,可以這樣設(shè)置:
<asp:button id="cmdCancel" runat="server" Text="Cancel" CausesValidation="False"></asp:button> |
另外一種寫法是:
cmdcancel.causesvalidation=false; |
這樣,一旦將causesvalidation屬性設(shè)置為false,則無論是客戶端的驗證還是服務(wù)端的驗證,都將不起作用。
如果要用選擇地對頁面的某些部分進行驗證,則需要使用驗證控件的某些方法和javascrpt來實現(xiàn),下面的列表,列舉了驗證控件中一些方法和屬性:
名稱 | 描述 |
Page_IsValid | 檢驗頁面中的所有輸入是否都合法,返回布爾值 |
Page_Validators | 當(dāng)前頁面中所有驗證控件所形成的一個數(shù)組 |
Page_ValidationActive | 為一個布爾值,表明是否執(zhí)行驗證功能,設(shè)置為false則關(guān)閉驗證功能。 |
Isvalid | 該屬性驗證客戶端的輸入是否合法 |
ValidatorEnable(val, enable) | 該方法將某個驗證控件作為傳遞參數(shù),啟動或禁止該控件使用驗證功能,在客戶端起作用 |
其中特別介紹一下validatorenable方法,該方法可以禁止某個控件使用驗證功能,比如:
<script language="javascript"> ValidatorEnable(驗證控件名稱, false) </script> |
如果要禁止頁面中所有驗證控件使用驗證功能,則可以配合page_validators數(shù)組(該數(shù)組中的元素是頁面中所有驗證控件),使用如下代碼
<script language="javascript"> for(i=0;i< Page_Validators.length;i++) { ValidatorEnable(Page_Validators[i], false) } </script> |
在實際使用的時候,將以上代碼搭配起來,就可以實現(xiàn)有選擇地對表單輸入進行驗證,我們先來看個具體的例子,如下圖:
在上圖中,我們要實現(xiàn)的是,當(dāng)用戶只輸入region name的值后,在點擊“get report”按鈕提交后,服務(wù)器端只會對region name的輸入進行校驗,而用戶沒用輸入的開始日期和結(jié)束日期,則不會進行校驗,也不會顯示出錯信息;反之,當(dāng)用戶在輸入開始日期和結(jié)束日期并提交后,系統(tǒng)也不會對region name 的輸入進行校驗。
代碼如下。
<script language="javascript"> function enableRegionValidators() { for(i=0;i< Page_Validators.length;i++) { ValidatorEnable(Page_Validators[i], false) } ValidatorEnable(rvRegion, true) } </script> |
其中,假設(shè)提交按鈕的名稱設(shè)置為”cmdregion”,而rvRegion則為一個校驗控件,用來檢驗用戶是否輸入了region name,為了使用客戶端腳本,在page_load()中加入以下代碼:
cmdRegion.Attributes.Add("onclick","enableRegionValidators();"); |
在上面的代碼中,當(dāng)用戶點擊提交按鈕(cmdregion)時,頁面中除了名字為rvregion的驗證控件生效外,其他的驗證控件是不起作用的(比如,你可以不輸入日期)。但上述的代碼只是檢驗客戶端的驗證控件,要在服務(wù)端也禁止某些驗證控件起作用,在cmd_region的提交事件中,還需要添加以下代碼:
private void cmdRegion_Click(object sender, System.EventArgs e) { rvStartDate.IsValid=true; rvEndDate.IsValid=true; lblReport.Text = "Region Wise Report For " + txtRegionName.Text.ToUpper(); } |
設(shè)置rvstartdate和rvenddate兩個驗證控件的isvalid屬性為true,將強制設(shè)置這兩個驗證控件通過了驗證,所以,即使不輸入開始和結(jié)束日期,也看不到相關(guān)的出錯信息。
好,下面我們來測試一下我們的代碼,先在region name中輸入一個值,如china,并提交,輸出如下:
可以看到,這個時候,我們沒有輸入開始日期和結(jié)束日期,但系統(tǒng)沒有提示出錯信息,同樣道理,只輸入開始日期和結(jié)束日期,而不輸入region name,也不會有提示出錯信息。
程序的主要代碼如下:
DisableClientValidation.aspx:
<form id="Form1" method="post" runat="server"> <TABLE id="Table1" cellSpacing="0" cellPadding="0" width="504" align="center" borderColorLight="#996633" border="1"> <TR> <TD style="FONT-WEIGHT: bold" align="center" colSpan="3">Region Wise Reports</TD> </TR> <TR> <TD>Region Name</TD> <TD> <asp:TextBox id="txtRegionName" runat="server"></asp:TextBox></TD> <TD> <asp:RequiredFieldValidator id="rvRegion" runat="server" ControlToValidate="txtRegionName" ErrorMessage="Region is required"></asp:RequiredFieldValidator></TD> </TR> <TR> <TD></TD> <TD></TD> <TD> <asp:Button id="cmdRegion" runat="server" Text="Get Report"></asp:Button></TD> </TR> </TABLE> <br> <br> <TABLE id="Table2" cellSpacing="0" cellPadding="0" width="504" border="1" align="center" borderColorLight="#996633"> <TR> <TD style="FONT-WEIGHT: bold" align="center" colSpan="3">Date Wise Reports</TD> </TR> <TR> <TD>Start Date</TD> <TD> <asp:TextBox id="txtStartDate" runat="server"></asp:TextBox></TD> <TD> <asp:RequiredFieldValidator id="rvStartDate" runat="server" ControlToValidate="txtStartDate" ErrorMessage="Start Date is required"></asp:RequiredFieldValidator></TD> </TR> <TR> <TD>End Date</TD> <TD> <asp:TextBox id="txtEndDate" runat="server"></asp:TextBox></TD> <TD> <asp:RequiredFieldValidator id="rvEndDate" runat="server" ControlToValidate="txtEndDate" ErrorMessage="End Date is required"></asp:RequiredFieldValidator></TD> </TR> <TR> <TD style="WIDTH: 139px"></TD> <TD></TD> <TD> <asp:Button id="CmdDate" runat="server" Text="Get Report"></asp:Button></TD> </TR> </TABLE> </form> <script language="javascript"> function disableScript() { for(i=0;i< Page_Validators.length;i++) { //Page_Validators[i].isvalid=true; ValidatorEnable(Page_Validators[i], false) } } function enableRegionValidators() { for(i=0;i< Page_Validators.length;i++) { ValidatorEnable(Page_Validators[i], false) } ValidatorEnable(rvRegion, true) } function enableDateValidators() { for(i=0;i< Page_Validators.length;i++) { ValidatorEnable(Page_Validators[i], false) } ValidatorEnable(rvStartDate, true) ValidatorEnable(rvEndDate, true) } </script> <asp:Label id="lblReport" style="Z-INDEX: 101; LEFT: 144px; POSITION: absolute; TOP: 344px" runat="server" Width="344px" Height="24px"></asp:Label> DisableClientValidation.aspx:.cs主要代碼: private void Page_Load(object sender, System.EventArgs e) { cmdRegion.Attributes.Add("onclick","enableRegionValidators();"); CmdDate.Attributes.Add("onclick","enableDateValidators();"); } private void cmdRegion_Click(object sender, System.EventArgs e) { rvStartDate.IsValid=true; rvEndDate.IsValid=true; lblReport.Text = "Region Wise Report For " + txtRegionName.Text.ToUpper(); } private void CmdDate_Click(object sender, System.EventArgs e) { rvRegion.IsValid=true; lblReport.Text = "Date Wise Report Betwee " + txtStartDate.Text.ToUpper() + " And " + txtEndDate.Text.ToUpper(); } } |