2009-05-15 2 views
0

Мой код:Проблема с помощью UpdatePanel с MasterPage в C#

<%@ 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, ссылка does't, кажется, не работает ... Нет ошибки, но ничего не происходит ...

Любая идея?

Спасибо!

ответ

2

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

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

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

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

Несомненно, из кода позади вы можете сделать this.text.Text = "новое значение" и напрямую получить к нему доступ. Хорошо. Но попробуйте использовать FindControl, и вы заметите, что все запутывается. Самый простой способ, чтобы действительно понять, что я описываю сделать следующее на странице с ним с помощью главной страницы:

  1. Установить точку останова на странице загрузки
  2. Поднимают ваше Immediate Window (CTRL + ALT + I)
  3. Тип это: this.text.ID (вы должны увидеть текст)
  4. типа в: this.text.ClientID (вы должны увидеть ctl00_cphBody_text)
  5. типа в: ? this.text.UniqueID (вы должны увидеть ctl00 $ cphBody $ text)
  6. Теперь проверьте результаты, полученные для шагов 3-5, используя FindControl. Используйте? This.FindControl («текст») и? This.FindControl («ctl00_cphBody_text») и? This.FindControl («ctl00 $ cphBody $ text») - все, кроме последнего, должны возвращать значение null.

Чтобы это понять, я предлагаю прочитать this article, в частности раздел «FindControl, JavaScript и контейнеры для именования».

EDIT: На самом деле я не могу проверить функцию на данный момент, но мне интересно, относится ли то, что я написал о FindControl к JavaScript, доступ к элементу управления. На основании this article, похоже, ClientID предлагается по UniqueID. Так что это может не сработать.

+0

Спасибо ... Но идентификатор находится прямо на главной странице ... Объект тоже в порядке ... – Paul