Проблема с использованием UpdatePanel с Masterpage в C # - PullRequest
1 голос
/ 15 мая 2009

Мой код:

<%@ 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>

Это прекрасно работает, но когда я использую его с главной страницей, ссылка не работает ... Нет ошибки, но ничего не происходит ...

Есть идеи?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 мая 2009

В вашем JavaScript попробуйте использовать UniqueID вместо ClientID:

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

Дайте мне знать, если это работает.

Я подозреваю, что текстовое поле ID больше не соответствует ожидаемому. Первоначально идентификатор представляет собой «текст», однако, как только вы переместите эту страницу на главную страницу, все изменится. Поскольку элементы управления теперь содержатся в главной странице, их идентификаторы эффективно изменяются, чтобы показать это отношение. Таким образом, вместо того, чтобы идентификатор текстового поля представлял собой «текст», теперь он будет выглядеть примерно так: ctl00 $ cphBody $ text - где «ctl100» - это префикс идентификатора главной страницы, а «cphBody» - это значение, которое вы присвоили ContentPlaceHolderID этой страницы соответственно.

Конечно, из кода вы можете сделать this.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 $)
  6. Теперь проверьте результаты, полученные для шагов 3-5, с помощью FindControl. Используйте? This.FindControl ("текст") и "this.FindControl (" ctl00_cphBody_text ") и" this.FindControl ("ctl00 $ cphBody $ text") - все, кроме последнего, должны возвращать ноль.

Чтобы лучше понять это, я предлагаю прочитать эту статью , в частности раздел под названием «FindControl, JavaScript и Naming Containers».

РЕДАКТИРОВАТЬ: Я на самом деле не могу проверить функцию в данный момент, но мне интересно, относится ли то, что я написал о FindControl, к доступу JavaScript к элементу управления. На основании этой статьи кажется, что ClientID предлагается вместо UniqueID. Так что это может не сработать.

1 голос
/ 15 мая 2009

Вы убедились, что ScriptManager правильно включен на главной странице? Вы можете найти эту ссылку полезной; Использование элемента управления ASP.NET UpdatePanel с мастер-страницами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...