ModalPopupExtender не отображается при обратной передаче кнопки в панели обновления - PullRequest
4 голосов
/ 07 апреля 2011

Я знаю, что этот вид вопроса задавался несколько раз, но я часами разбирал ответы, которые не совпадают или не работают, и я в конце концов.

Предыстория: у меня есть ситуация, когда я хочу оценить запись, чтобы убедиться, что она соответствует определенному набору критериев. Если это соответствует критериям, подайте предупреждающее сообщение для подтверждения от пользователя. Я не хочу поднимать всплывающее окно, если критерии не соответствуют.

Псевдокод того, что я хочу выполнить:

  • Пользователь вводит информацию в несколько полей
  • Пользователь нажимает кнопку «Сохранить» (cmdUpdate)
  • в функции щелчка «Сохранить», которая проверяет, существует ли такая же запись в базе данных (например, это дубликат).
  • Если это не дубликат, продолжайте с функцией сохранения
  • Если это дубликат, запросите у пользователя подтверждение для сохранения дубликата.

Мне не удается отобразить всплывающее окно до / после обратной передачи. Я попробовал обходной путь установки значения сеанса для поддержания состояния. Это значение дает положительный результат в prerender и вызывает modalpopupextender.show, но оно никогда не срабатывает успешно на экране. Я не против перехода на решение javascript, если у кого-то есть лучший метод, но я должен выполнить проверку на наличие дубликатов в коде asp.net.

Markup:

<asp:UpdatePanel ID="upMainContent" runat="server" UpdateMode="Conditional"  ChildrenAsTriggers="False" >
    <ContentTemplate>
    <asp:Label ID="lblDummy" runat="server" EnableViewState="false" Style="display: none;" />
    <asp:Panel ID="pnlConfirmation" runat="server" Width="400px" Style="display: none;" CssClass="ModalPopupFront">
        <div ID="Div1" runat="server" class="PopupHeader" style="width:400px;">&nbsp;&nbsp;Duplicate Record</div>
        <br />
        <asp:Label ID="lblConfirmationMessage" runat="server" Text="This record has already exists.<br/> Are you sure you want to save a duplicate entry?"></asp:Label><br />
        <br />
        <div style="text-align:right;">
        <asp:Button ID="btnSaveAnyway" runat="server" Text="Save" OnClick="btnSaveAnyway_Click" />
        <asp:Button ID="btnCancelSave" runat="server" Text="Cancel" OnClick="btnCancelSave_Click"  />
        </div>
    </asp:Panel>
    <ajax:ModalPopupExtender ID="mpeSaveConfirmation" runat="server" Enabled="False" 
        TargetControlID="lblDummy" PopupControlID="pnlConfirmation" 
        BackgroundCssClass="modalBackground" DropShadow="true" 
        CancelControlID="btnCancelSave"
        RepositionMode="RepositionOnWindowResizeAndScroll" PopupDragHandleControlID="pnlConfirmation" Drag="true">
    </ajax:ModalPopupExtender>


    <!-- all the input fields/misc content -->

     <asp:Button id="cmdUpdate" runat="server" CausesValidation="true" OnClick="cmdUpdate_Click" Text="Save" ValidationGroup="vg1"  ToolTip="Save the current record" TabIndex="102" />

    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlStateId" EventName="SelectedIndexChanged" />
        <asp:AsyncPostBackTrigger ControlID="ddlCountyId" EventName="SelectedIndexChanged" />
    </Triggers>
</asp:UpdatePanel> 

Код:

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        '...

        If GetSessionValue("HackWorkaround") Then
            mpeSaveConfirmation.Enabled = True
            mpeSaveConfirmation.Show()         
        End If        
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        '...
        If not Page.IsPostBack Then
            SetSessionValue("HackWorkaround", False)
        End if
        '...
    End Sub

 Protected Sub cmdUpdate_Click(ByVal sender As Object, ByVal e As System.EventArgs)


        If tbOpTill.NewRecordIdenticalToLast() And tbOpRecord.NewRecordIdenticalToLast() Then
            SetSessionValue("HackWorkaround", True)
        Else
            SetSessionValue("HackWorkaround", False)
            SetSessionValue("LastOpRecordIDSaved", tbOpRecord.OpRecordId)

            Dim isEdit As Boolean = ResetOpRecord("Till", tbOpTill)
            SmartRedirect("Optill/oprecord_edit.aspx")
        End If

    End Sub


Protected Sub btnSaveAnyway_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    SetSessionValue("HackWorkaround", False)
    mpeSaveConfirmation.Enabled = False
    mpeSaveConfirmation.Hide()
    'Duplicate record exists, but the customer wants to save anyway.
    DoSave()

    Dim isEdit As Boolean = ResetOpRecord("Till", tbOpTill)
    SmartRedirect("Optill/oprecord_edit.aspx")
End Sub

Protected Sub btnCancelSave_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    SetSessionValue("HackWorkaround", False)
    mpeSaveConfirmation.Enabled = False
    mpeSaveConfirmation.Hide()
    'do nothing and return to the screen.
End Sub

1 Ответ

2 голосов
/ 07 апреля 2011

Ваша проблема здесь:

<ajax:ModalPopupExtender ID="mpeSaveConfirmation" runat="server" Enabled="False"

Protected Sub btnSaveAnyway_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    SetSessionValue("HackWorkaround", False)
    **mpeSaveConfirmation.Enabled = False**
    mpeSaveConfirmation.Hide()

Сделайте это в коде позади.и синхронизировать скрыть шоу соответственно.Также я могу видеть в вашем коде в некоторых местах, где вы используете Style = "display: none".Поэтому, если вы хотите отобразить, вам нужно использовать HtmlStyleWriter.Display, «блок».Если вы используете Visible true false в этом случае, он не будет работать.Я имею в виду, что где бы вы ни использовали видимое истинное ложное, в коде позади вы должны использовать подобное.Если вы используете стиль, то в codebehind вы должны использовать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...