1. 程式人生 > >自定義控制元件校驗失效的問題

自定義控制元件校驗失效的問題

專案做開發時,使用了一個自定義控制元件,程式碼如下:
控制元件頁面段 KnowtypeCtrl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="KnowtypeCtrl.ascx.cs" Inherits="Controls_WorktypeCrtl" %>
<asp:DropDownList ID="ddlKnowtype" runat="server" CssClass="fixedwidth"></asp:DropDownList>


頁面隱藏程式碼段

[ValidationPropertyAttribute("SelectedValue")]
public partial class Controls_WorktypeCrtl : System.Web.UI.UserControl
{
public string SelectedValue
{
get { return ddlKnowtype.SelectedValue; }
set { ddlKnowtype.SelectedValue = value; }
}
...

}


呼叫該控制元件的程式碼段:

<body>
<form id="form1" runat="server">
<div>

<CustomCtrl:knowtype ID="ddlKnowtype" runat="server" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="ddlKnowtype" runat="server" ErrorMessage="XXX: RequiredFieldValidator" />

<asp:Button id="btnOK" runat="server" Text="確定" Cssclass="botton" OnClick="btnOK_Click"></asp:Button>
</div>


OnClick方法的實現:

//修改確認
protected void btnOK_Click(object sender, EventArgs e)
{
string oper = operate.Value;
switch (oper)
{
case IOperate.ADD://增加操作
onAdd();
break;
case IOperate.EDIT://修改操作
onUpdate();
break;
default:
break;
}
string itemtype = hfItemtype.Value;
Response.Redirect("SubjectiveManage.aspx?itemtype=" + itemtype);
}


這裡我利用系統提供的Validator校驗自己的控制元件。
我的設想是,程式在後臺執行onclick方法前,會先行校驗,就走不到onclick方法了,順序如下:

web端onclick->後臺校驗失敗->返回web頁面

沒想到每次點選以後,介面就自動跳轉了,似乎校驗控制元件沒起作用。

再到btnOK_Click處設定斷點,程式確實有呼叫其程式碼,這就比較奇怪了,是因為自定義的控制元件我不小心附上初值了,而導致非空校驗失敗的嗎?

於是我在控制元件的get方法處設定了斷點,發現每次返回的確是空值,這裡也沒問題,說明包含自定義控制元件的頁面的校驗過程應該如下:
web端onclick->後臺校驗失敗->後臺繼續執行onClick方法->返回web頁面

那頁面中應該有記錄是否校驗成功的欄位,百度一下,Page.IsValid可以解決此問題。

Asp.net在後臺校驗不管是否成功,都會響應按鈕動作。