使用__doPostBack从JavaScript调用ASP.NET TextChanged事件

时间:2012-12-04 16:06:15

标签: javascript asp.net event-handling ajax.net dopostback

与许多其他人一样,我正在尝试从JavaScript调用.NET控件的服务器端事件。

具体来说,我想在名为TextChanged的TextBox上触发txtSearch事件。因此,我希望从客户端获得以下事件:

protected void txtSearch_TextChanged(object sender, EventArgs e)

在SO上阅读了很多答案(例如herehere)我有以下JavaScript:

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

但服务器端事件永远不会触发。

我尝试了很多排列:AutoPostBack为true和false,在ASPX( OnTextChanged =“”)的服务器端指令中声明和不使用EventValidation在页面声明中关闭,使用ClientID而不是EVENTTARGET参数中的UniqueID ...但事件仍然永远不会被触发。

其他几点

  • txtSearch按钮控件也是UpdatePanel的触发器,如果​​重要的话。
  • 我正在转换现有的代码,其中有很多代码,我正在寻找可以放到每个页面上的东西,而不是将代码隐藏事件转换为PageMethods。

谁能告诉我还需要做什么?

2 个答案:

答案 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未触发。