get_postBackElement()始终未定义

时间:2011-08-17 11:39:19

标签: javascript asp.net

<asp:ScriptManager ID="ScriptManager1" ScriptMode="Release" runat="server">
</asp:ScriptManager>
<script type="text/javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

    function BeginRequestHandler(sender, args) {
        var elem = args.get_postBackElement();
        alert("begin " + elem.value);
    }
    function EndRequestHandler(sender, args) {
        alert("end request handler");
    }
</script>

这是我尝试检索从UpdatePanel触发的回发元素。我的更新面板如下所示:

            <asp:UpdatePanel ID="UpdatePanel_Project" UpdateMode="Conditional" runat="server">
                <ContentTemplate>
                    <asp:DropDownList ID="DropDownList_Project" runat="server">
                    </asp:DropDownList>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="DropDownList_Customer" />
                </Triggers>
            </asp:UpdatePanel>

我相信我已经做好了一切......

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您必须将控件的ClientIDMode属性值(在本例中为DropDownList_Customer下拉列表)设置为AutoID。请查看我的回复here

答案 1 :(得分:1)

你的回发触发器是什么?此控件似乎缺少DropDownList_Customer

 <asp:AsyncPostBackTrigger ControlID="DropDownList_Customer" />

答案 2 :(得分:1)

我终于解决了这个痛苦,这是我的解决方案。

基本上我们只需要覆盖Microsoft的 _uniqueIDToClientID 功能,这样就不会忽略回发元素上的静态客户端ID。

您只需在页面底部添加以下代码即可。

if (Sys.WebForms.PageRequestManager) {
  var prm = Sys.WebForms.PageRequestManager.getInstance();

  prm._uniqueIDToClientID = function (uniqueID) {
    var clientID = uniqueID.replace(/\$/g, "_");
    if (document.getElementById(clientID)) {
      return clientID;
    }

    var lastDollar = uniqueID.lastIndexOf("$");
    if (lastDollar === -1) {
      return clientID;
    }

    if (lastDollar+1 > uniqueID.length) {
      return clientID;
    }

    var staticID = uniqueID.slice(lastDollar + 1);

    return document.getElementById(staticID) ? staticID : clientID;
  };
}

现在,您的BeginRequestHandler中的 get_postBackElement()将不再是未定义的!

请确保我们的代码在Microsoft的MicrosoftAjaxWebForms.js之后执行,因为我们正在覆盖其 _uniqueIDToClientID 函数。

  

注意:如果页面上存在元素,我的函数将始终返回默认的WebForms ClientID。仅当无法找到元素时   页面,它检查是否存在具有静态ID的元素   在页面上。如果存在,则使用staticID,否则使用   默认返回默认的WebForms ClientID。