与许多其他人一样,我正在尝试从JavaScript调用.NET控件的服务器端事件。
具体来说,我想在名为TextChanged
的TextBox上触发txtSearch
事件。因此,我希望从客户端获得以下事件:
protected void txtSearch_TextChanged(object sender, EventArgs e)
在SO上阅读了很多答案(例如here和here)我有以下JavaScript:
__doPostBack('ctl00$ctl00$Container$Main$txtSearch', 'TextChanged');
但服务器端事件永远不会触发。
我尝试了很多排列:AutoPostBack为true和false,在ASPX(即 OnTextChanged =“”)的服务器端指令中声明和不使用EventValidation在页面声明中关闭,使用ClientID而不是EVENTTARGET参数中的UniqueID ...但事件仍然永远不会被触发。
其他几点
txtSearch
按钮控件也是UpdatePanel的触发器,如果重要的话。谁能告诉我还需要做什么?
答案 0 :(得分: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示例。
答案 1 :(得分: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
未触发。