2010-10-05 101 views

回答

33

所以我知道每個人都表現出了基本客戶端的方法,這是好的,但我想至少說明了處理服務器上的特定客戶端事件的解決方案。

讓我們來看看代碼,並逐件過目一下作品。

由於ASP.Net的TextBox不公開爲的onblur服務器端事件,你將不得不做手工。幸運的是,這很容易實現。假設你在.aspx頁面中有這麼一小段代碼。每當TextBox失去焦點時,您都​​想更新Label控件服務器端。

<asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br /> 
<asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br /> 
<asp:Label ID="lblOutput" runat="server" /> 

ASP.Net有一個內置的client side function被調用觸發回發,它有兩個參數:

  1. 目標(控制造成該事件的ID)
  2. 參數(可選信息你想

可能只是wireup在標記事件通過傳遞給服務器)添加下面的屬性和價值,你的文本框:

onblur="__doPostBack('tbOnBlur','OnBlur');" 

然而,框架有一個簡單的方法來生成這個腳本爲你的服務器端。在你的Page_Init方法,只需添加一個調用GetPostBackEventReference,併爲你的控制,像這樣分配給「的onblur」屬性:

protected void Page_Init(object sender, EventArgs e) 
{ 
    var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbOnBlur, "OnBlur"); 
    tbOnBlur.Attributes.Add("onblur", onBlurScript); 
} 

使用標準服務器控件的事件,事件wireup和調用被自動處理的適合你實施IPostBackEventHandler。這是一個很大的一次性解決方案的工作,所以讓剛剛通過檢查請求參數手動處理。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     var ctrlName = Request.Params[Page.postEventSourceID]; 
     var args = Request.Params[Page.postEventArgumentID]; 

     HandleCustomPostbackEvent(ctrlName, args); 
    } 
} 

private void HandleCustomPostbackEvent(string ctrlName, string args) 
{ 
    //Since this will get called for every postback, we only 
    // want to handle a specific combination of control 
    // and argument. 
    if (ctrlName == tbOnBlur.UniqueID && args == "OnBlur") 
    { 
     lblOutput.Text = "On Blur Event Handled Server Side!" + DateTime.Now; 
    } 
} 

在它並不是非常難以模擬服務器端的事件,如果你不介意挖掘到框架有點結束。

希望這有助於!

乾杯,
喬希

+0

+1 Josh。這確實是非常翔實的。 – 2010-10-06 05:06:23

+0

非常感謝您的美麗答案Genii。你的帖子對我來說非常有幫助。 – 2012-04-19 09:40:59

+0

我已經看到了其他一些關於如何實現這一點的建議,而你的答案是迄今爲止最好的。謝謝! – Aaron 2012-05-22 17:03:04

4
if (!Page.IsPostBack) 
    { 
     txtName.Attributes.Add("onblur","alert('Hello world')"); 
    } 
14

如果你想在服務器文本框後做一些事情失去焦點,您可以添加的AutoPostBack =「真」,如果你不想回發重新加載整個頁面,使用一個UpdatePanel:

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" 
          OnTextChanged="TextBox1_TextChanged" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

功能TextBox1_TextChanged可以然後做與文本(服務器端)的東西。

+0

出於興趣 - 如何在UpdatePanel停止整個 – Kamal 2010-10-05 14:51:46

+0

頁@Kamal的重裝......事實並非如此。更新面板不會阻止整個頁面在服務器上加載。本質上發生的是回發是使用XmlHttpRequest執行客戶端,然後除了UpdatePanel的所有內容都被丟棄並返回。它減輕了普通回發的「閃爍」,但在服務器上不會節省時間處理。 – Josh 2010-10-05 15:34:04

+4

它重新加載整個頁面,但只發送updatepanel(s)的HTML和一些JavaScript來更新響應中的內容。響應可能比下載整個頁面小得多,並且瀏覽器不必重新渲染頁面。這可以加快這個過程,用戶不會注意到任何閃爍,並且體驗更加平滑。 – Willem 2010-10-05 18:38:25

0

你爲什麼不使用。引發LostFocus作品同樣具有:

OnTextChanged="TextBox_TextChanged"