1

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

具体来说,我想TextChanged在名为txtSearch. 因此,我希望从客户端到达以下事件:

protected void txtSearch_TextChanged(object sender, EventArgs e)

在阅读了很多关于 SO 的答案(例如这里这里)后,我有以下 JavaScript:

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

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

我尝试了许多排列:使用 AutoPostBack 真假,使用和不使用 ASPX 上的服务器端指令中声明的事件(OnTextChanged=""),使用 ClientID 在页面声明中关闭 EventValidation而不是 EVENTTARGET 参数中的 UniqueID ......但该事件仍然从未被触发。

其他几点

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

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

4

2 回答 2

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 设置 autopostback 属性为 false ,为您的控件或页面声明设置 AutoEventWireup="true" 。OnTextChanged 事件服务器端也可以工作。如果您在项目中不使用 jquery,请告诉我,我会给您一些不使用 jquery 的 javascript 示例。

于 2012-12-05T07:13:23.230 回答
1

我已经尝试过了,它对我有用:

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

服务器端和点击时触发asp:TextBox的客户端。该脚本通过以下方式生成:input__doPostBack__doPostBackPostBackOptions

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,是存储在视图状态中的;用户输入的新文本存储在表单数据中。当TextBox加载视图状态数据时,它会获取旧值。这与表格中出现的新值进行比较。如果值不同,TextChanged则触发事件。如果否,则不会触发事件处理程序。这是Page_Load事件被触发(发生回发)的原因,但txtSearch_TextChanged由于值TextBox没有改变而没有触发。

于 2012-12-05T08:16:14.817 回答