2011-06-14 4 views
1

У меня есть JavaScript, который устанавливает значение HiddenField, а затем заставляет обратную передачу. Я могу проследить этот JavaScript и, похоже, работает правильно. Однако, когда я тестирую значение HiddenField из события загрузки страницы, он больше не установлен.HiddenField Value Lost on Postback

Поиск в Интернете, я вижу много сообщений о потере HiddenField ценностей, но ни один из них, похоже, не делает то же, что и я.

Вот моя функция JavaScript (измененная):

function EditItemItem(itemId) { 
    document.getElementById('<%= EditItemId.ClientID %>').value = itemId; 
    __doPostBack('<%= EditItemUpdatePanel.ClientID %>', ''); 
} 

А вот часть моей разметки (с изменениями):

<div id="EditItemBox" runat="server"> 
    <asp:HiddenField runat="server" id="EditItemId" /> 
    <asp:UpdatePanel ID="EditItemUpdatePanel" runat="server" 
     UpdateMode="Conditional"> 
     <ContentTemplate> 
     <asp:Panel ID="EditItemPanel" runat="server" 
      CssClass="ModalDialog" style="display:none;"> 
      <div>Edit an Item</div> 
      <!-- ... --> 
     </asp:Panel> 
    </asp:UpdatePanel> 
</div> 

Кто-нибудь есть какие-нибудь идеи?

+0

Джонатан. Вы заработали его в конце? – marto

+0

@marto: Не совсем. Кажется, он имеет какое-то отношение к динамически загруженному пользовательскому элементу управления. Я действительно смог лучше определить проблему и даже воспроизвести проблему в небольшом тестовом проекте. Я разместил новый вопрос [здесь] (http://stackoverflow.com/questions/6406180/javascript-triggered-updatepanel-not-updating-correctly). –

ответ

5

Это проще, если вы удалите runat=server из скрытого поля, а затем получить доступ к нему от форматов формы Request.Form["EditItemId"]. Затем он работает каждый раз.

Ваш код будет:

function EditItemItem(itemId) { 
    document.getElementById('EditItemId').value = itemId; 
    __doPostBack('<%= EditItemUpdatePanel.ClientID %>', ''); 
} 

<div id="EditItemBox" runat="server"> 
    <input type="hidden" id="EditItemId" name="EditItemId" value="" /> 
    <asp:UpdatePanel ID="EditItemUpdatePanel" runat="server" 
     UpdateMode="Conditional"> 
     <ContentTemplate> 
     <asp:Panel ID="EditItemPanel" runat="server" 
      CssClass="ModalDialog" style="display:none;"> 
      <div>Edit an Item</div> 
      <!-- ... --> 
     </asp:Panel> 
    </asp:UpdatePanel> 
</div> 
+0

Ну, кроме предупреждения, которое я получаю, когда элемент управления HiddenField не имеет атрибута runat = "server", даже это не работает для меня. На данный момент я не могу сказать, связана ли проблема с AJAX или чем-то. 'Request.Form ['EditItemId]' всегда возвращает null. –

+0

Извините. Вы не должны использовать . Я сейчас обновлю ответ. – marto

+0

@marto: У меня должно быть что-то еще, так как оно все еще равно нулю. Я предполагаю, что это обратная передача AJAX, которую я получаю, когда она вызывает событие загрузки страницы. Так или иначе данные не возвращаются на сервер. –

1

Если вы ожидали значение на AJAX в пост-обратно через UpdatePanel то вам нужно поместить его в ContentTemplate ...

+0

Я предполагаю, что Page_Load вызывается в ответ на обратную передачу AJAX. Я попытался перемещать элементы управления HiddenField непосредственно внутри ContentTemplate и даже попытался снова в EditItemPanel, но я получаю тот же результат. –