C# 在C中使用带有母版页的UpdatePanel时出现问题#

C# 在C中使用带有母版页的UpdatePanel时出现问题#,c#,asp.net,updatepanel,master-pages,postback,C#,Asp.net,Updatepanel,Master Pages,Postback,我的代码: <%@ Page Language="C#" %> <script runat="server"> void button_Click(object sender, EventArgs e) { label.Text = "Refreshed by server side event handler at " + DateTime.Now + ".<br>Value provided:" + text.Text;

我的代码:

<%@ Page Language="C#" %>

<script runat="server">

    void button_Click(object sender, EventArgs e)
    {
        label.Text = "Refreshed by server side event handler at " + DateTime.Now + ".<br>Value provided:" + text.Text;
    }

</script>      
<html>
<head>
    <title>How to update an UpdatePanel with JavaScript</title>

    <script type="text/javascript">
        function UpdPanelUpdate(id) {
            var obj = document.getElementById("<%= text.ClientID %>");
            obj.value = id;
            __doPostBack("<%= button.ClientID %>", "");
        }
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div>
        <a href="javascript:UpdPanelUpdate('Value passed by javascript')">Update the Panel</a>
        <asp:TextBox ID="text" runat="server" Style="display: none;"></asp:TextBox>
        <asp:Button ID="button" runat="server" OnClick="button_Click" Style="display: none;" />
        <asp:UpdatePanel runat="server" ID="UpdatePanel1" UpdateMode="Conditional" ChildrenAsTriggers="false">
            <contenttemplate>
               <asp:Label ID="label" runat="server"></asp:Label>
            </contenttemplate>
            <triggers>
               <asp:AsyncPostBackTrigger ControlID="button" EventName="Click" />
            </triggers>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

无效按钮\单击(对象发送者,事件参数e)
{
label.Text=“由服务器端事件处理程序在“+DateTime.Now+”刷新
提供的值:”+Text.Text; } 如何使用JavaScript更新UpdatePanel 函数UpdPanelUpdate(id){ var obj=document.getElementById(“”); obj.value=id; __doPostBack(“,”); }
这很好用,但当我把它与母版页一起使用时,链接似乎不起作用。。。没有错误,但什么也没发生

有什么想法吗


谢谢

您是否确保ScriptManager正确包含在母版页上?你可能会发现这个链接很有用

在JavaScript中,尝试使用UniqueID而不是ClientID:

function UpdPanelUpdate(id) {
            var obj = document.getElementById("<%= text.UniqueID%>");
            obj.value = id;
            __doPostBack("<%= button.UniqueID%>", "");
        }
函数UpdPanelUpdate(id){
var obj=document.getElementById(“”);
obj.value=id;
__doPostBack(“,”);
}
让我知道这是否有效

我怀疑现在的情况是,文本框ID不再是您所期望的。ID最初是“文本”,但一旦将该页面移动到母版页,情况就会发生变化。由于控件现在包含在母版页中,因此它们的ID会有效地更改以显示这种关系。因此,文本框的ID不再是“text”,而是类似于ctl00$cphBody$text,其中“ctl100”是母版页的ID前缀,“cphBody”是分别分配给该页的ContentPlaceholder ID的值

当然,您可以从后面的代码执行此操作。text.text=“new value”并直接访问它。那很好。但是尝试使用FindControl,你会发现事情变得混乱。要真正理解我所描述的内容,最简单的方法是使用母版页在页面上执行以下操作:

  • 在页面加载时设置断点
  • 打开即时窗口(CTRL+ALT+I)
  • 键入:?this.text.ID(您应该看到文本)
  • 键入:?this.text.ClientID(您应该看到ctl00\u cphBody\u text)
  • 键入:?this.text.UniqueID(您应该看到ctl00$cphBody$text)
  • 现在使用FindControl测试步骤3-5的结果。使用?this.FindControl(“text”)和?this.FindControl(“ctl00_cphBody_text”)以及?this.FindControl(“ctl00$cphBody$text”)-除最后一个外,所有其他控件都应返回null
  • 为了进一步理解这一点,我建议阅读“FindControl、JavaScript和命名容器”一节

    编辑:我目前实际上无法测试该函数,但我想知道我发布的关于FindControl的内容是否适用于访问该控件的JavaScript。基于这一点,ClientID似乎比UniqueID更受欢迎。所以这可能行不通