Показать модальный диалог jQuery со стороны сервера - PullRequest
0 голосов
/ 02 марта 2011

Это первый раз, когда я использую диалоги jQuery, поэтому этот вопрос может быть несколько простым, но я пока не нашел ответов на этот вопрос.

Я использую ASP.Net Ajax для выполнения асинхронной обратной передачи, когда пользователь вводит что-то в текстовое поле (фактически сканируя штрих-код). Это работает как шарм. Теперь мне нужно позволить пользователю выбирать между двумя вариантами при определенных условиях. Поэтому мне нужен постбэк, чтобы решить, нужно ли показывать этот диалог и какое у него содержимое.

Q: Как открыть диалоговое окно jQuery UI (модальный) со стороны сервера, позволить пользователю выбрать опцию, выполнить повторную передачу на сервер и обработать это решение.

Я думаю, мне нужно AjaxControlToolkit.ToolkitScriptManager.RegisterClientScriptBlock, чтобы зарегистрировать скрипт, который открывает диалог, я прав? Если да, то какой скрипт открывает диалог загрузки?

Могу ли я затем отправить обратно на сервер, установив AutoPostback=true в элементе управления (например, RadioButtons или DropDownList) внутри диалогового окна и обработав соответствующие события?

Какой самый лучший / самый простой способ выполнить то, что я пытаюсь?

Редактировать : Я решил заключить диалог в пользовательский элемент управления ASP.Net и показать / скрыть его. Этот подход рекомендуется или он каким-либо образом конфликтует с jQuery?

Ваша помощь очень важна по любому из этих вопросов.



Мое решение (спасибо Каппа):

Также полезной была эта ссылка: Использование JQuery UI Dialog с ASP.Net и AJAX Update Panel и комментарий от Ричарда.

Я создал UserControl в качестве контейнера для jQuery-Dialog:

Диалог-ASCX:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="DialogRecurringRMA.ascx.vb" Inherits="ERP.DialogRecurringRMA" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<script type="text/javascript">
    function createDialog() {
        //setup dialog
        var source = $('#Dialog_RecurringRMA').parent();
        $('#Dialog_RecurringRMA').dialog({
            modal: true,
            resizable: false,
            autoOpen: true,
            draggable: true,
            width: 420,
            height: 200,
            title: '<%= Title %>',
            open: function (type, data) {
                $(this).parent().appendTo(source);
            }
        });
    }

    function showDialog() {
        $('#Dialog_RecurringRMA').dialog("open");
    }

    function closeDialog() {
        $('#Dialog_RecurringRMA').dialog("close");
    }

    </script>

<asp:UpdatePanel ID="UpdDialog" UpdateMode="Conditional" ChildrenAsTriggers="true" runat="server">
    <ContentTemplate>
    <div id='Dialog_RecurringRMA' style="display:none">
            <asp:RadioButtonList ID="RblApplyRmaToCharge" ValidationGroup="Dialog" runat="server">
                <asp:ListItem Value="1">Create new RMA and add it to current Charge</asp:ListItem>
                <asp:ListItem Value="2">Do not create new RMA</asp:ListItem>
            </asp:RadioButtonList>
            <asp:RequiredFieldValidator ID="NothingSelected" Display="None" ControlToValidate="RblApplyRmaToCharge" ValidationGroup="Dialog" runat="server" ErrorMessage="You have to decide whether RMA should be applied to current charge or not">*</asp:RequiredFieldValidator>
            <asp:ValidatorCalloutExtender ID="NothingSelectedExtender" BehaviorID="NothingSelectedExtender" runat="server" TargetControlID="NothingSelected" Width="250px"  PopupPosition="BottomRight"  HighlightCssClass="highlight" WarningIconImageUrl="~/images/warning.gif" CloseImageUrl="~/images/close.gif" />
            <br /><br /><br /><br />
            <asp:Button ID="BtnApply" runat="server" OnClientClick="javascript:Page_ClientValidate();if(Page_IsValid)closeDialog();" CausesValidation="true" ValidationGroup="Dialog" Text="apply selection" />
    </div>
    </ContentTemplate>
</asp:UpdatePanel>

Диалог-Codebind:

Public Class DialogRecurringRMA
    Inherits System.Web.UI.UserControl

    Public Enum DialogResult As Int32
        NoResult = 0
        CreateRma = 1
        DoNotCreateRma = 2
    End Enum

    Public Event DialogClosed(ByVal dialog As DialogRecurringRMA)

    Public Property Title As String
        Get
            If ViewState("Title") Is Nothing Then
                ViewState("Title") = "RMA with this IMEI found, create anyway?"
            End If
            Return DirectCast(ViewState("Title"), String)
        End Get
        Set(ByVal value As String)
            ViewState("Title") = value
        End Set
    End Property

    Public Property CreateRmaText As String
        Get
            Return Me.RblApplyRmaToCharge.Items(0).Text
        End Get
        Set(ByVal value As String)
            Me.RblApplyRmaToCharge.Items(0).Text = value
        End Set
    End Property

    Public Property DoNotCreateRmaText As String
        Get
            Return Me.RblApplyRmaToCharge.Items(1).Text
        End Get
        Set(ByVal value As String)
            Me.RblApplyRmaToCharge.Items(1).Text = value
        End Set
    End Property

    Public ReadOnly Property Result() As DialogResult
        Get
            If Me.RblApplyRmaToCharge.SelectedIndex <> -1 Then
                Return If(Me.RblApplyRmaToCharge.SelectedIndex = 0, DialogResult.CreateRma, DialogResult.DoNotCreateRma)
            Else
                Return DialogResult.NoResult
            End If
        End Get
    End Property

    Public Sub Reset()
        Me.RblApplyRmaToCharge.SelectedIndex = -1
    End Sub

    Private Sub CloseDialog()
        ScriptManager.RegisterClientScriptBlock(Me, GetType(Page), UniqueID, "closeDialog()", True)
    End Sub

    Private Sub ShowDialog()
        ScriptManager.RegisterStartupScript(Me, GetType(Page), UniqueID, "createDialog();showDialog()", True)
    End Sub

    Public Sub OpenDialog()
        Reset()
        ShowDialog()
        Me.UpdDialog.Update()
    End Sub

    Protected Sub BtnApply_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnApply.Click
        Page.Validate()
        If Me.Page.IsValid Then
            CloseDialog()
            RaiseEvent DialogClosed(Me)
        End If
    End Sub
End Class

Теперь максимально просто отобразить диалоговое окно с того места, где оно используется:

Me.DialogRecurringRMA1.OpenDialog()

В моем случае это было немного сложно, потому что здесь использовался Dialog-ascx:

MasterPage -> Page -> TabContainer-Panel -> UserControl -> UserControl -> Dialog

Но это сработало как шарм:)

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Чтобы открыть уже созданное диалоговое окно jQuery UI, вы должны вызвать команду $("#elementId").dialog("open");.

Итак, ваш код на стороне сервера должен выяснить, должен ли отображаться диалог, и затем он должен зарегистрироваться.JavaScript, чтобы открыть его с помощью этой команды.

Редактировать:

Относительно проблемы AutoPostback="true": для ASP.NET не имеет значения, находятся ли ваши команды в диалоге пользовательского интерфейса jQuery или нетсамо диалоговое окно имеет вид div с display: none;.

Осторожно:

Не знаю, известно ли вам, но когда вы подаете заявлениедиалоговое окно, элемент, получающий его, перемещается в конец элемента body.

Это означает, что он будет снаружи form элемента, и все внутри никогда не будетотправлено обратно на сервер (я ударился об этом два дня назад).

Чтобы преодолеть эту проблему, вы должны объявить диалог следующим образом: $("#elementId").dialog().parent().appendTo("#formId");, таким образом, диалог по-прежнему перемещается после формы,но часть .parent().appendTo("#formId") возвращает его обратно.

1 голос
/ 02 марта 2011

Возможно, вам нужен какой-то флаг на вашей странице (хранится в скрытом поле или что-то, что является серверным элементом управления).Вы можете обнаружить это в вашем $ (document) .ready () или в ссылке и делать что угодно.Это должно быть установлено на стороне сервера.

Но если вы пытаетесь выполнить другой сценарий при обратной передаче (опять же, при условии, что здесь полная обратная передача), используйте ClientScriptManager.RegisterStartupScript

Для второй проблемы у меня есть кнопки, которые являются серверными элементами управления на моей странице, что соответствует нажатию пользователем кнопки OK или Отмена (при условии, что для диалога есть две кнопки).Так что у меня было бы две кнопки на стороне сервера;а также имеют соответствующие обработчики событий в коде.

Просто после постбэка мне пришлось бы скрыть эти две кнопки, подходящие для использования клиентского JavaScript.Но я могу вызывать события с помощью другого кода JavaScript.

...