none
jQuery + ASP.NET - проблема с передачей состояния на сервер RRS feed

  • Вопрос

  • У меня такая проблема: использую иструменты jQuery UI, чтобы показать диалог. Для этого у меня есть отдельный div, куда я кинул UpdatePanel и TextBox. Но когда идёт обращение на сервер (при нажатии на триггер) то этот TextBox пустой (TextBox.Text.Equals(String.Empty)), как-будтоEnableViewState == false. Убирал UpdatePanel из div, ставил в другое место, всё работает, значит cTextBox что-то делает jQuery. Как можно решить эту проблему?

    15 июля 2011 г. 5:10

Ответы

  • Ок, что могу сказать по коду:

    если уж вы используете UpdatePanel, то все серверные контролы должны находиться внутри нее. Смысла объявлять кнопку LoginButton вне панели, а потом объявлять триггер на нее нет - панель ничего за LoginButton не знает.

    Ну и раз уже используется AJAX, то может есть смысл использовать ModalPopup из Ajax Control Toolkit?

    Ну и использовать UpdatePanel внутри div - далеко не лучший выход. Модальные окна и Ajax вообще не некомендую использовать вместе - очень много проблем вылазит.

    19 июля 2011 г. 7:50
  • Но когда идёт обращение на сервер (при нажатии на триггер) то этот TextBox пустой (TextBox.Text.Equals(String.Empty)), как-будтоEnableViewState == false. Убирал UpdatePanel из div, ставил в другое место, всё работает, значит cTextBox что-то делает jQuery. Как можно решить эту проблему?


          jQuery ещё как делает :)  - я чесно говоря даже удивлен, что у вас PostBack из диалога срабатывает.  Когда открывается диалог jQuery весь div этого диалога

          переносит в DOM-е за пределы тега form, соответственно на сервер с контролов внутри диалога ничего не уходит.  Решается эта проблема кучей способов, самый  простой и универсальный  из них это обратное перемещение div-а в DOM-е внутрь тега form перед PostBack-ом - как-нибудь так form.appenChild(your_div_dialog);

    • Предложено в качестве ответа A.G.Sedov 20 июля 2011 г. 10:00
    • Помечено в качестве ответа Abolmasov DmitryModerator 21 июля 2011 г. 5:17
    20 июля 2011 г. 9:57

Все ответы

  • Думаю, код не помешал бы.
    16 июля 2011 г. 16:51
  • То, что на странице aspx:

    <div id="dialog-form" title="Вход в систему" style="display: none;">
     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
     <ContentTemplate>
     <asp:Literal ID="Literal1" runat="server" Text='<div id="login-inf" class="div-inf">Введите необходимую информацию</div>'>
     </asp:Literal>
     <br />
     <div style="height: 40px;">
     Ваш <b>Никнэйм</b>:
     <br />
     <asp:TextBox ID="TextBox1" runat="server" CssClass="text ui-widget-content ui-corner-all" Width="308"></asp:TextBox>
     </div>
     <br />
     <div>
     Введите <b>Пароль</b>:
     <br />
     <asp:TextBox ID="TextBox2" runat="server" CssClass="text ui-widget-content ui-corner-all" TextMode="Password"
     Width="308"></asp:TextBox>
     </div>
     </ContentTemplate>
     <Triggers>
     <asp:AsyncPostBackTrigger ControlID="LoginButton" EventName="Click" />
     </Triggers>
     </asp:UpdatePanel>
     <div style="padding-top: 10px; width: 100%;">
     <div style="float: left">
     <div class="div-but">
     <asp:LinkButton ID="LoginButton" runat="server" OnClick="LoginButton_Click" Height="30px" style="vertical-align: middle">Вход</asp:LinkButton>
     </div>
     </div>
     <div style="float: left; padding-left: 8px">
     <asp:UpdateProgress ID="UpdateProgress1" runat="server" align="center">
     <ProgressTemplate>
     <img alt="loading..." src="Content/images/main/loading4.gif" align="middle" />
     </ProgressTemplate>
     </asp:UpdateProgress>
     </div>
     <div style="float: right">
     <div class="div-but">
     <asp:Button ID="CancelButton" runat="server" Text="Отмена" OnClientClick="$('#dialog-form').dialog('close');" Height="30px"/>
     </div>
     </div>
     </div>
     </div>
    


    LoginButton - триггер для входа

    Вызов диалога:

    $("#dialog-form").dialog({
     autoOpen: false,
     height: 290,
     width: 350,
     modal: true,
     show: "fade",
     hide: "fade",
    });
    

     

     

    Проблему то я решил, обходным путём, но хотелось бы по-человечески:)



    17 июля 2011 г. 6:58
  • Ок, что могу сказать по коду:

    если уж вы используете UpdatePanel, то все серверные контролы должны находиться внутри нее. Смысла объявлять кнопку LoginButton вне панели, а потом объявлять триггер на нее нет - панель ничего за LoginButton не знает.

    Ну и раз уже используется AJAX, то может есть смысл использовать ModalPopup из Ajax Control Toolkit?

    Ну и использовать UpdatePanel внутри div - далеко не лучший выход. Модальные окна и Ajax вообще не некомендую использовать вместе - очень много проблем вылазит.

    19 июля 2011 г. 7:50
  • Но когда идёт обращение на сервер (при нажатии на триггер) то этот TextBox пустой (TextBox.Text.Equals(String.Empty)), как-будтоEnableViewState == false. Убирал UpdatePanel из div, ставил в другое место, всё работает, значит cTextBox что-то делает jQuery. Как можно решить эту проблему?


          jQuery ещё как делает :)  - я чесно говоря даже удивлен, что у вас PostBack из диалога срабатывает.  Когда открывается диалог jQuery весь div этого диалога

          переносит в DOM-е за пределы тега form, соответственно на сервер с контролов внутри диалога ничего не уходит.  Решается эта проблема кучей способов, самый  простой и универсальный  из них это обратное перемещение div-а в DOM-е внутрь тега form перед PostBack-ом - как-нибудь так form.appenChild(your_div_dialog);

    • Предложено в качестве ответа A.G.Sedov 20 июля 2011 г. 10:00
    • Помечено в качестве ответа Abolmasov DmitryModerator 21 июля 2011 г. 5:17
    20 июля 2011 г. 9:57