2009-02-12 7 views
2

Почему следующие ошибки приводят к ошибке компиляции для строки B (Label2, вне UpdatePanel), но не для строки A (Label1, внутри UpdatePanel)? Я бы ожидал, что обе строки выдадут ошибку, поскольку оба элемента управления находятся в пределах одного и того же ретранслятора и поэтому не должны быть напрямую доступны за пределами ретранслятора, поскольку нет уникального экземпляра.Область управления внутри Repeater, с и без UpdatePanel

<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Label1.Text = Label1.ClientID; // Line A - compiles fine 
     Label2.Text = Label2.ClientID; // Line B - "The name 'Label2' does not exist in the current context" 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:ScriptManager ID="ScriptManager1" runat="server" /> 
      <asp:Repeater runat="server" ID="Repeater1"> 
       <ItemTemplate> 
        <asp:UpdatePanel runat="server" ID="UpdatePanel1"> 
         <ContentTemplate> 
          <asp:Label ID="Label1" runat="server" Text="Label1" /> 
         </ContentTemplate> 
        </asp:UpdatePanel> 
        <asp:Label ID="Label2" runat="server" Text="Label2" /> 
       </ItemTemplate> 
      </asp:Repeater> 
     </div> 
    </form> 
</body> 
</html> 

ответ

1

Я делаю ставку, если вы закомментируете строку B, вы получите ошибку во время выполнения. Label1 будет пустой ссылкой.

Когда вы создаете элементы управления на странице ASPX, Visual Studio пытается помочь вам, добавив элементы управления в код, расположенный в файле конструктора, который расширяет класс для страницы. В этом случае он добавляет один, когда этого не должно быть.

Короткий ответ - это ошибка. Вы должны отправить его, но это не должно быть проблемой блокировки.

+0

Нет, исключений не существует. Я добавил код в Page_Load, который привязал ретранслятор к списку с двумя элементами, за которым следует строка A. В результате был изменен текст для Label2 во втором элементе ретранслятора. –

0

Реальный вопрос, почему вы создаете несколько панелей обновления в ретрансляторе? Поместите один за пределы репитера и назовите его хорошим. Или, если вы просто хотите обновить какой-либо текст, не используйте панель обновления, используйте обратный вызов с некоторым сценарием на стороне клиента, чтобы установить элемент dom. Проверьте это http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/

0

Ни один из них не является правильным в любом случае. Вы не должны пытаться напрямую ссылаться на элемент управления, который содержится в ItemTemplate.

Если вы хотите изменить эти ярлыки во время выполнения, вы должны использовать OnItemDataBound и FindControl. Чтобы «найти» ярлык в UpdatePanel, вам нужно будет использовать UpdatePanel.ContentTemplateContainer.FindControl().

+0

Спасибо, что не ответил на мой вопрос. Поскольку в моем первоначальном вопросе четко сказано: «Я бы ожидал, что обе строки выдадут ошибку», и мне интересно, почему это не так. –

+0

Когда вы делаете что-то неправильно, непредсказуемые результаты предсказуемы? –

Смежные вопросы