与其他许多控件一样,我正在尝试从JavaScript调用.NET控件的服务器端事件。
具体来说,我想在名为txtSearch
的TextBox上激发TextChanged
事件。因此,我希望从客户端到达以下事件:
protected void txtSearch_TextChanged(object sender, EventArgs e)
在阅读了许多关于SO的答案后(例如这里和这里),我有以下JavaScript:
__doPostBack('ctl00$ctl00$Container$Main$txtSearch', 'TextChanged');
但是服务器端事件永远不会触发。
我尝试了许多排列:AutoPostBack为true和false,有和没有ASPX服务器端指令中声明的事件(即OnTextChanged="),在页面声明中关闭EventValidation,在EVENTTARGET参数中使用ClientID而不是UniqueID。。。但该活动仍然从未启动。
的其他几个点
txtSearch
按钮控件也是UpdatePanel的触发器,以备不时之需- 我正在转换现有的代码,其中有很多,我正在寻找可以放在每个页面上的东西,而不是将事件背后的代码转换为PageMethods
有人能告诉我还需要做什么吗?
我试过这个,它对我有用:
<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;
}
当文本框的值发生更改并单击submit
按钮时,txtSearch_TextChanged
事件处理程序将触发。
但请注意,对于像TextBox
这样的控件,文本存储在视图状态中;用户输入的新文本存储在表单数据中。当TextBox
加载视图状态数据时,它将获得旧值。将其与表单中的新值进行比较。如果值不同,则会触发TextChanged
事件。如果否,则不会触发事件处理程序。这就是Page_Load
事件被激发(发生回发)的原因,但由于TextBox
的值没有更改,txtSearch_TextChanged
没有被激发。
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示例。