ASP.Net Repeater с Bootstrap 3 Модальное подтверждение при удалении - PullRequest
0 голосов
/ 01 июня 2018

Я потратил весь день, пытаясь добиться этого, но эффектно потерпел неудачу.

У меня есть повторитель ASP.Net на моей странице, и я добавил LinkButton, который открывает красивое модальное окно подтверждения Bootstrap 3 (дляудаление записи).

Я пытался объединить решения, но мои знания Java меня не подводят.

Это мой ретранслятор:

<asp:Repeater OnItemCommand="rptImages_ItemCommand" ID="rptImages" OnItemCreated="rptImages_ItemCreated" OnItemDataBound="rptImages_ItemDataBound" runat="server">
                                    <HeaderTemplate>
                                    </HeaderTemplate>
                                    <ItemTemplate>

                                        <asp:Image ID="imgThumb" CssClass="product-image" runat="server" ImageUrl='<%# string.Format("~/{0}", Eval("ImageUrl")) %>' />

                                        <asp:LinkButton ID="lbDelete" runat="server" CommandArgument='<%#Eval("ProductImageId")%>' CommandName="delete" data-toggle="tooltip" data-placement="top" title="Delete this record" OnClientClick="return ConfirmDelete()"><i class="image-button fa fa-trash"></i></asp:LinkButton>

                                    </ItemTemplate>
                                    <FooterTemplate>
                                    </FooterTemplate>
                                </asp:Repeater>

Это мойСценарий Java вверху страницы:

<script>
    function ConfirmDelete() {
        $('#DeleteModal').modal(); // initialized with defaults
        // $('#DeleteModal').modal({ keyboard: false })   // initialized with no keyboard
        // $('#DeleteModal').modal('show')
        return false;
    }
</script>

Это код моего всплывающего окна начальной загрузки:

<div class="modal fade" id="DeleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                        <h4 class="modal-title" id="H3">Delete this record?</h4>
                    </div>
                    <asp:UpdatePanel ID="upDel" runat="server">

                <ContentTemplate>
                    <div class="modal-body">
                        Are you sure you want to delete this image?
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                        <asp:Button ID="btnDeleteImage" runat="server" OnClick="btnDeleteImage_Click" CssClass="btn btn-danger" Text="Delete" />
                    </div>
                    </ContentTemplate>

                <Triggers>

                    <asp:AsyncPostBackTrigger  ControlID="btnDeleteImage" EventName="Click" />

                </Triggers>

            </asp:UpdatePanel>
                </div>
            </div>
        </div>

Когда я нажимаю кнопку удаления, появляется модальный вариант начальной загрузки.На кнопку «Отмена» модал закрывается.На кнопке «Удалить» модальное окно также закрывается, но моя команда элемента gridview никогда не запускается.

Буду вечно благодарен за любую помощь.

Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Как и отличный ответ @fnostro, я хотел бы поделиться тем, что именно я сделал, чтобы заставить его работать.

Повторите тег HTML, где он содержит ASP: LinkButton (используется для удаления)

<asp:Repeater runat="server"> 
  <HeaderTemplate>
  </HeaderTemplate>
  <ItemTemplate>
  <asp:Image ID="imgThumb" CssClass="product-image" runat="server" ImageUrl='<%# string.Format("~/{0}", Eval("ImageUrl")) %>' />
  <asp:LinkButton ID="lbDelete" runat="server" data-imageid='<%# Eval("ProductImageId")%>' OnClientClick="return ConfirmDelete(this)"><i class="image-button fa fa-trash"></i></asp:LinkButton> 
  </ItemTemplate>
  <FooterTemplate>
  </FooterTemplate> 
</asp:Repeater>

Код JavaScript, передавая параметр HTML5 в ASP: HiddenField, а также передавая значение модальному.

 <script type="text/javascript">
        //Confirm Record Deletion
        function ConfirmDelete(cnt) {
            var doc = document.getElementById("<%= myHiddenField.ClientID%>");
            doc.value = cnt.getAttribute("data-imageid");
            var itemRef = document.getElementById("currentItem");
            itemRef.innerHTML = doc.value
            $('#DeleteModal').modal('show'); // initialized with defaults
            return false;
        }
</script>

ASP: HiddenField должен содержать справочные данные (размещенные вне повторителя).

<asp:HiddenField ID="myHiddenField" runat="server" ClientIDMode="Static" />

Модальные теги начальной загрузки, расположенные прямо под вашим повторителем.

<div class="modal fade" id="DeleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
     <div class="modal-content">
        <div class="modal-header">
            <h5 class="modal-title" id="myModalTitle">Confirm Delete</h5>
               <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
               </button>
        </div>
        <div class="modal-body">Please confirm that you want to delete this Image with ID (<strong><span id="currentItem"></span></strong>) ?
        </div>
        <div class="modal-footer">
           <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <asp:Button ID="btnDelete" runat="server" CssClass="btn btn-danger" Text="Delete" />
       </div>
    </div>

Код для кнопки удаления.

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
        //My delete procedure
        //To access your ImageID stored in the HiddenField, use.
        //myHiddenField.Value
End Sub
0 голосов
/ 04 июня 2018

Во-первых, я вижу некоторую разметку для UpdatePanel, которую я не считаю необходимой.Вообще говоря, когда дело доходит до UpdatePanels, лучше сначала заставить вещи работать, а затем реализовывать их позже, если это действительно необходимо.

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

Если бы вы воспользовались встроенными моделями js confirm(), все работало бы так, как ожидалось:

OnClientClick="return window.confirm('Are you sure you want to delete this image')"

Это работает, потому что встроенный confirm() функция является синхронной, что означает, что она ожидает ответа пользователя перед возвратом.

Однако, модалы Bootstrap являются асинхронными, что означает следующее:

OnClientClick="return ConfirmDelete()"

вызывает это:

function ConfirmDelete() 
{
  $('#DeleteModal').modal(); // initialized with defaults
  return false;
}

, который, потому что вызов .modal() является асинхронным, заставляет его немедленно вернуться, и поэтому ConfirmDelete() выходит и возвращает false, что хорошо, потому что это предотвращает обратную передачу и позволяет отображать модальный режим.В противном случае страница будет отправлена ​​назад, и вы никогда не увидите модальный.

Теперь, в этот момент, поскольку ConfirmDelete() уже вернулся, вы находитесь за пределами мира повторителя.Таким образом, единственное, что вам нужно сделать, это передать модалу уникальные данные ключа, связанные со строкой ретранслятора, которая активировала модал, так что при подтверждении вы удаляете соответствующую запись.

После нажатия btnDeleteImage происходитвызвать обратную передачу на btnDeleteImage_Click в вашем коде позади.Здесь вы добавляете код для удаления соответствующей записи.

Как вы передаете эти ключевые данные?Одна возможность - заполнить один или несколько HiddenField, на которые есть ссылки при обратной передаче.Скрытые поля являются хорошим способом передачи данных между клиентской и серверной кодами.

, поэтому предположим, что вы добавили это на свою страницу .aspx:

<asp:HiddenField ID="hfDeleteParameter1" runat="server" ClientIDMode="Static" />

Примечание: ClientIDMode="Static" предотвращает искажение идентификатора, поэтому на него можно ссылаться, как и ожидалось, в js-коде на стороне клиента.

Итак, в событии ItemDataBound вы можете программно создать вызов функции OnClientClick, где вы передаетеключевые данные в качестве параметра:

Это VB, если вы используете C #, он должен быть похожим.

Private Sub rptImages_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptImages.ItemDataBound
    If e.Item.ItemType = ListItemType.Item Or 
       e.Item.ItemType = ListItemType.AlternatingItem Then
         Dim lb As LinkButton = e.Item.FindControl("lbDelete")
         lb.OnClientClick = String.Format("return ConfirmDelete('{0}');",
                            row_specific_key_data)
    End If
End Sub

и в js:

function ConfirmDelete(rowData) {
    $('#hfDeleteParameter1').val( rowData );
    $('#DeleteModal').modal(); // initialized with defaults
    return false;
}

Затем, когда пользователь подтвердит удаление, нажав btnDeleteImage, это вызовет обратную передачу и вызовет кнопки Нажмите событие btnDeleteImage_Click, где вы можете получить доступ к скрытому полю:

Private Sub btnDeleteImage_Click(sender As Object, e As EventArgs) Handles btnCustomLookback.Click
    dim keydata as string = hfDeleteParameter1.value

    // do delete 
End Sub

Это один вариантиз многих.

Для записи вы могли бы сделать вызов операции удаления источника данных ретранслятора, но вам нужно будет заполнить параметры и затем вызвать DataSource.delete(), но это не совсем так, как это предполагаетсяРабота.

Операции удаления / обновления / вставки, определенные в источнике данных серверного элемента управления, предназначены для использования этим элементом управления, он автоматически управляет параметрами.Вызывать операции delete (), например, когда вам приходится переопределять эти управляемые параметры, - плохая привычка.

Поэтому вам нужно написать пользовательскую функцию удаления, которая действует направильная ключевая информация.

...