2012-12-04 53 views
1

與其他許多人一樣,我試圖從JavaScript調用.NET控件的服務器端事件。使用__doPostBack調用JavaScript的TextChanged事件

具體而言,我想在名爲txtSearch的TextBox上觸發TextChanged事件。因此,我希望從客戶端到達以下事件:

protected void txtSearch_TextChanged(object sender, EventArgs e) 

已經對SO讀很多答案(例如herehere)我有以下的JavaScript:

__doPostBack('ctl00$ctl00$Container$Main$txtSearch', 'TextChanged'); 

但服務器端事件從不會觸發。

我已經試過無數的排列:與將AutoPostBack真假,有和沒有的ASPX在服務器端的指令聲明的事件(即 OnTextChanged =「」),與EventValidation在關閉頁面聲明,使用ClientID而不是EVENTTARGET參數中的UniqueID ...但事件仍然未被觸發。

幾個其它點

  • txtSearch按鈕控制的也是一個UpdatePanel觸發,在該情況下,重要的。
  • 我正在轉換現有代碼,其中有相當多的代碼,並且正在尋找可以放在每個頁面上的內容,而不是將代碼隱藏事件轉換爲PageMethods。

有誰能告訴我我還需要做什麼?

+0

爲了幫助縮小問題 - 「Page_Load」事件是否被解僱? – Blachshma

+0

@Blachshma - 是的。 – awj

回答

1

我已經試過這一點,它爲我工作:

<asp:TextBox runat="server" ID="txtSearch" OnTextChanged="txtSearch_TextChanged"></asp:TextBox> 
<input type="button" value="submit" onclick="<%= GetOnChangedScript() %>" /> 

服務器端asp:TextBox,和客戶端input其上點擊觸發__doPostBack。該__doPostBack腳本通過PostBackOptions產生:

protected string GetOnChangedScript() 
{ 
    var options = new PostBackOptions(txtSearch, string.Empty); 
    options.AutoPostBack = true; 
    options.RequiresJavaScriptProtocol = true; 
    var script = Page.ClientScript.GetPostBackEventReference(options); 
    return script; 
} 

txtSearch_TextChanged事件處理火災時,文本框的值被改變,並且submit按鈕被點擊。

但是請注意,對於像TextBox這樣的控件,文本存儲在viewstate中;用戶輸入的新文本存儲在表單數據中。當TextBox加載視圖狀態數據時,它將獲取舊值。這與表單中的新值進行比較。如果值不同,則會觸發TextChanged事件。如果否,事件處理程序不會被解僱。這是Page_Load事件被解僱(回發發生)的原因,但txtSearch_TextChanged未啓動,因爲TextBox的值未發生更改。

+0

我已經完全按照它的出現實現了您的建議,並且它不會觸及TextChanged事件,只會觸發Page_Load。這個建議還有另外兩個問題:(1)我希望能夠完全用JavaScript來完成這項工作,而不是爲每個代碼添加一個額外的功能 - 我必須實施這個改變; (2)我有一些自定義的JavaScript,我想在txtSearch的值被髮回之前運行,但是設置了AutoPostBack =「True」,我沒有機會這樣做。 – awj

+0

@awj:(1)這是**正確的**添加'__doPostBack'類引用的方法。服務器端控件的名稱可以更改,然後所有代碼片段都不起作用。但這取決於你如何粘貼這些塊。 (2)在我的例子中'AutoPostBack'屬性沒有設置。它的默認值是'false',所以這個功能默認是關閉的。最後,自上次發送服務器端事件觸發以來,文本框的**值**必須更改。這是服務器端事件的工作方式。 – Alex

+0

請不要誤解我的意思,@Alex,在這個階段,我願意實施任何有效的工具。我現在已經有了你的代碼工作(我想我以前省略了OnTextChanged屬性),並且正在研究如何使用自定義事件來連接它,以便在特定情況下觸發回發。 – awj

1
function initTxtBox(){ $('#<%=txtBox.ClientID%>').on('keyup change', function() {setTimeout('txtpostback()', 0); return false;});} 
function txtpostback(){__doPostBack('" + txtCadastreNumber.UniqueID + @"',''); 
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(initTxtBox); 

爲您的txtbox設置auotpostback屬性爲false,並且AutoEventWireup =「true」用於您的控件或頁面聲明。 OnTextChanged事件服務器端也會工作。 如果你不在項目中使用jQuery,讓我知道,我給你一些沒有jQuery使用的JavaScript示例。

+0

感謝Boriss,但那對我不起作用。 我現在有 with 位於頁面底部。我完全按照原樣試用了你的腳本,但Firefox給了我一個「無用的setTimeout調用」,所以我用引號將__doPostBack包起來。 現在按一個鍵會導致刷新。 – awj

+0

好的。現在我在我的項目中檢查它 –

+0

是的,你是正確的錯誤是現在:)現在我也修復它在我的項目。但回發事件已經發生。 –