2010-05-25 2 views
0

Это кажется мне очень странным. У меня есть обработчик обратного вызова сделано в VB, который прекрасно работает с этим кодом:Обратный вызов ASP.NET выпадающего списка не работает внутри div

<!-- Div Outside Form --> 
<div class="container"> 
<form id="querydata" runat="server"> 
<asp:DropDownList runat="server" ID="myddl" AutoPostBack="true" OnSelectedIndexChanged="myddlhandler"> 
<asp:ListItem>Hello</asp:ListItem> 
<asp:ListItem>Goodbye</asp:ListItem> 
</asp:DropDownList> 
<asp:Label runat="server" ID="label1"></asp:Label> 
</form> 
</div> 
<!-- Yep, they're matching --> 

я могу изменить значение, и все это A-OK, но если я изменить код для этого (Div внутри формы):

<form id="querydata" runat="server"> 
<!-- Div inside form doesn't work :(--> 
<div class="container"> 
<asp:DropDownList runat="server" ID="myddl" AutoPostBack="true" OnSelectedIndexChanged="myddlhandler"> 
<asp:ListItem>Hello</asp:ListItem> 
<asp:ListItem>Goodbye</asp:ListItem> 
</asp:DropDownList> 
<asp:Label runat="server" ID="label1"></asp:Label> 
</div> 
</form> 

Это сообщение об отказе больше не работает. Как работает asp? Или это какая-то магическая ошибка, которая работает только для меня? И что самое главное, если Asp не должен работать таким образом, как я должен это делать?

Спасибо!

+0

Есть ли у вас панель ajax/jquery/update на этой странице? Можете ли вы опубликовать полностью действующие тестовые тесты со всем кодом, а также мы можем помочь отладить? –

ответ

0

Ну, оказывается, я был неправ - это был не тот div, который давал мне проблемы, это были другие элементы, не относящиеся к ASP.

Bad:

<div> 
    <form runat="server"> 
     <asp:DropDownList runat="server" autopostback="true" onselectedindexchanged="myhandlername"> 
     <asp:ListItem>One</asp:ListItem> 
     <asp:ListItem>Two</asp:ListItem> 
     </asp:DropDownList> 
     <div> 
     <input type="text" id="mytext" /> 
     </div> 
    </form> 
</div> 

Хорошо:

<div> 
    <form runat="server"> 
     <asp:DropDownList runat="server" autopostback="true" onselectedindexchanged="myhandlername"> 
     <asp:ListItem>One</asp:ListItem> 
     <asp:ListItem>Two</asp:ListItem> 
     </asp:DropDownList> 
     <div> 
     <asp:TextBox runat="server" ID="mytext></asp:TextBox> 
     </div> 
    </form> 
</div> 

Таким образом, очевидно ASP компоненты формы при использовании с AutoPostBack несовместимы с обычными компонентами HTML формы.

0

Форма должна сохранять обратную связь при изменении выпадающего списка при смешивании типов элементов, но значения в элементах html не будут сохранены, поскольку они не «покрыты» viewstate.

0

Я не знаю, будет ли это иметь какое-либо значение, но я заметил, что вы не закрываете свой тег <form> в своем ответе (что действительно должно быть редактированием вашего вопроса, если вы все еще хотите получить ответ). Кроме того, «компоненты формы ASP» передаются в «обычные компоненты HTML-формы» (с некоторым JavaScript и т. Д.), Поэтому нет причин, по которым они должны быть «несовместимыми».

+0

Ах, спасибо - это действительно не так (как правило) имеет значение, потому что HTML действительно либерально воспринимает «правильный» код. Но это плохая форма <каламбур>. Я знаю, что они превращаются в «обычный» код (view source, woo), поэтому мысль мне никогда не приходила в голову. Только после того, как я попытался создать небольшой пример для Робин, я обнаружил, что действительно были «нормальные» компоненты, которые нарушили обратную передачу. Я не знаю, почему, и это не имеет большого смысла. Что касается ответа - я думаю, так как я обнаружил ответ, я могу также опубликовать его в качестве ответа. –

+0

@Wayne: Я думал, что это все еще проблема, но теперь я вижу вашу точку зрения. Я удивлен, что это так. Я бы предположил, что теги формы, отличные от ASP, не вызовут никаких проблем, если у вас не будет конфликтов Id. Полагаю, я никогда не пробовал. У вас может быть обычный тег

без runat = "server", и вы можете разместить там любые HTML-элементы. Конечно, вы должны работать с ним отдельно, без ViewState и т. Д. –

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