在ASP.net中,有一系列的驗證控制項,可以很方便地驗證使用者輸入的資料是否合法。儘管這些驗證控制項十分強大並且容易使用,但它們有一個缺點,那就是,一般在使用它們的時候,在提交網頁時,都要對整個網頁的使用者輸入進行驗證。在驗證控制項中,沒有一種直接的方法,可以只驗證頁面中某些部分的輸入。本文將介紹如何利用ASP.NET驗證控制項以及JavaScript特性,完成只驗證頁面中某些部分的輸入的功能。
為什麼有的時候,只需要對頁面的某些部分的輸入進行驗證呢?舉一個例子,在某些應用中,有的時候為了使用者的輸入方便,有可能在同一個頁面中,存在多個要求使用者輸入資料和提交資料的表單(這在一些資訊系統的後台管理系統中,比較常見)。而使用者每次的一個操作,比如使用者輸入每次進貨的數量並提交,則只需要對該提交的資料進行驗證,而頁面中其他的表單,比如每次出貨的數量,由於使用者沒有填入資料,則不需要對其進行校正了,這樣也提高了應用的效率。
下面我們來看下如何有選擇地對錶單輸入進行驗證,首先全面瞭解下asp.net中關於輸入驗證控制項的一些屬性和用法。
首先介紹的是causesvalidation屬性。如果我們不想對某個按鈕提交的事件進行驗證,只需要將causesvalidation屬性設定為false,比如,有一個”取消”按鈕,可以這樣設定:
<asp:button id="cmdCancel" runat="server" Text="Cancel" CausesValidation="False"></asp:button>
另外一種寫法是:
cmdcancel.causesvalidation=false;
這樣,一旦將causesvalidation屬性設定為false,則無論是用戶端的驗證還是服務端的驗證,都將不起作用。
如果要用選擇地對頁面的某些部分進行驗證,則需要使用驗證控制項的某些方法和Javascrpt來實現,下面的列表,列舉了驗證控制項中一些方法和屬性:
名稱 描述
Page_IsValid 檢驗頁面中的所有輸入是否都合法,返回布爾值
Page_Validators 當前頁面中所有驗證控制項所形成的一個數組
Page_ValidationActive 為一個布爾值,表明是否執行驗證功能,設定為false則關閉驗證功能。
Isvalid 該屬性驗證用戶端的輸入是否合法
ValidatorEnable(val, enable) 該方法將某個驗證控制項作為傳遞參數,啟動或禁止該控制項使用驗證功能,在用戶端起作用
其中特別介紹一下validatorenable方法,該方法可以禁止某個控制項使用驗證功能,比如:
<script language="javascript">
ValidatorEnable(驗證控制項名稱, false)
</script>
如果要禁止頁面中所有驗證控制項使用驗證功能,則可以配合page_validators數組(該數組中的元素是頁面中所有驗證控制項),使用如下代碼
<script language="javascript">
for(i=0;i< Page_Validators.length;i++)
{
ValidatorEnable(Page_Validators[i], false)
}
</script>
在實際使用的時候,將以上代碼搭配起來,就可以實現有選擇地對錶單輸入進行驗證,我們先來看個具體的例子,我們要實現的是,當使用者只輸入region name的值後,在點擊“get report”按鈕提交後,伺服器端只會對region name的輸入進行校正,而使用者沒用輸入的開始日期和結束日期,則不會進行校正,也不會顯示出錯資訊;反之,當使用者在輸入開始日期和結束日期並提交後,系統也不會對region name 的輸入進行校正。
代碼如下。
<script language="javascript">
function enableRegionValidators()
{
for(i=0;i< Page_Validators.length;i++)
{
ValidatorEnable(Page_Validators[i], false)
}
ValidatorEnable(rvRegion, true)
}
</script>
其中,假設提交按鈕的名稱設定為”cmdregion”,而rvRegion則為一個校正控制項,用來檢驗使用者是否輸入了region name,為了使用用戶端指令碼,在page_load()中加入以下代碼:
cmdRegion.Attributes.Add("onclick","enableRegionValidators();");
在上面的代碼中,當使用者點擊提交按鈕(cmdregion)時,頁面中除了名字為rvregion的驗證控制項生效外,其他的驗證控制項是不起作用的(比如,你可以不輸入日期)。但上述的代碼只是檢驗用戶端的驗證控制項,要在服務端也禁止某些驗證控制項起作用,在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();
}
設定rvstartdate和rvenddate兩個驗證控制項的isvalid屬性為true,將強制設定這兩個驗證控制項通過了驗證,所以,即使不輸入開始和結束日期,也看不到相關的出錯資訊。
好,下面我們來測試一下我們的代碼,先在region name中輸入一個值,如china,並提交
可以看到,這個時候,我們沒有輸入開始日期和結束日期,但系統沒有提示出錯資訊,同樣道理,只輸入開始日期和結束日期,而不輸入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();
}
}