ASP.NET中的CustomValidator可以提供我們發揮無窮的想象力,不過有時候還是有點麻煩,在用戶端寫複雜的腳本嘛,實在是太麻煩。在服務端寫驗證嘛,又感覺要做一次送出,總是好像不純粹。
當然,我們可以用updatepanel來模拟類似ajax的效果,我今天實在是吃飽了沒事幹了,提供另一種方案來實作無重新整理送出+用戶端驗證+服務端邏輯驗證。方法就是:回調
所要實作的業務邏輯依然非常簡單,檢查使用者名是否存在。
aspx的html body的部分很簡單,全部是web伺服器控件
<body>
<form id="form1" runat="server">
<div>
<span style="">使用者名字</span>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*" ClientValidationFunction="CheckEven"
ControlToValidate="TextBox1" Display="Dynamic"></asp:CustomValidator><br />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
</form>
</body>
一個TextBox ,一個對其驗證的CustomValidator ,一個測試送出過程的Button 。CustomValidator 有一個用戶端驗證函數CheckEven。
是以我們看下,改aspx頁面的script的定義
<script type="text/javascript" language="javascript">
var isValid = false;
//服務端處理後的回調
function Validata(args, context) {
isValid = args == "true";
}
//CustomValidator需要驗證時觸發
function CheckEven(source, args) {
//agrs.Value就是對應輸入控件包含的值
CallServer(args.Value, null);
//CallServer将需要驗證的資料送出到伺服器端,然後回調Validata函數
args.IsValid = isValid;
</script>
CheckEven函數式當需要用戶端驗證的時候由CustomValidator 元件激發,需要驗證的值将以args.Value的形式傳遞,驗證的結果可以指派給args.IsValid 。
當我們擷取到需要驗證的值時,我們用CallServer(args.Value, null)函數送出給aspx.cs中的代碼,伺服器邏輯驗證執行後,将結果傳遞給用戶端的Validata(args, context)函數,其中args就是我們的驗證結果。
回調的執行次序有點古怪,你想通了用戶端的執行過程後,再往下看。
以下是aspx.cs檔案的代碼
public partial class WebForm2 : System.Web.UI.Page, ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
string cer = this.ClientScript.GetCallbackEventReference(this, "args", "Validata", "", false);
//我一般是寫在配置檔案中
string callServerFormat = "function CallServer(args, context) {{ {0} }}";
string callbackScript = string.Format(callServerFormat, cer);
this.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
#region ICallbackEventHandler 成員
public string GetCallbackResult()
return HasName ? "false" : "true";
public void RaiseCallbackEvent(string eventArgument)
HasName = eventArgument.IndexOf("admin") > -1;
private bool HasName
set;
get;
#endregion
protected void Button1_Click(object sender, EventArgs e)
首先你要關注的是,改page類需要實作ICallbackEventHandler接口。
該接口的兩個實作方法,如果我們不必太在意一些規範的術語的話,那麼大緻就是
RaiseCallbackEvent(string eventArgument)從用戶端的CallServer函數中得到需要驗證的值eventArgument
string GetCallbackResult()将驗證的結果以string的方式傳回給用戶端的Validata函數中的args
現在我們來關注下最後的關鍵點,用戶端和服務端的橋梁CallServer,CallServer其實就是一個傳遞參數的函數,在函數我們再load的時候進行注冊
這段代碼的直接結果就是當頁面生成的時候,在頁面中生成以下腳本
function CallServer(args, context) { WebForm_DoCallback('__Page',args,Validata,"",null,false) }
好了,如果你現在吧代碼都抄完了,那可以執行下頁面看看,是否用戶端已經可以完全在沒有送出感覺的時候進行了驗證!
我的開發環境:VS2008 SP1+XP+IE8
本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/803151