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

时间:2009-05-15 16:10:01

标签: 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;
    }

</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>

这很好用,但是当我在Masterpage中使用它时,链接似乎不起作用......没有错误,但没有任何反应......

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

function UpdPanelUpdate(id) {
            var obj = document.getElementById("<%= text.UniqueID%>");
            obj.value = id;
            __doPostBack("<%= button.UniqueID%>", "");
        }

如果有效,请告诉我。

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

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

  1. 在页面加载时设置断点
  2. 打开您的即时窗口(CTRL + ALT + I)
  3. 输入:?this.text.ID (您应该看到文字)
  4. 输入:?this.text.ClientID (你应该看到ctl00_cphBody_text)
  5. 输入:?this.text.UniqueID (你应该看到ctl00 $ cphBody $ text)
  6. 现在使用FindControl测试您获得的步骤3-5的结果。使用?this.FindControl(“text”)和?this.FindControl(“ctl00_cphBody_text”)和?this.FindControl(“ctl00 $ cphBody $ text”) - 除最后一个之外的所有内容都应返回null。
  7. 为了进一步理解这一点,我建议阅读this article,特别是标题为“FindControl,JavaScript和Naming Containers”的部分。

    编辑:我实际上目前无法测试该功能,但我想知道我发布的FindControl是否适用于访问控件的JavaScript。根据{{​​3}},似乎ClientID是基于UniqueID建议的。所以这可能不起作用。

答案 1 :(得分:1)

您是否确保在母版页上正确包含ScriptManager?您可能会发现此链接很有用; Using the ASP.NET UpdatePanel Control with Master Pages