<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>
我相信我已经做好了一切......
有什么想法吗?
答案 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。