Функциональность модальной всплывающей кнопки Bootstrap 4 предотвращена с помощью кликабельного элемента <tr> - PullRequest
0 голосов
/ 14 мая 2018

У меня есть следующий графический интерфейс для простого приложения управления запасами:

enter image description here

Моя проблема в том, что * @Url.Action(...) элемента <tr> не позволяет кнопке удаления (мусор) вызывать мод загрузки. Страница переместится на страницу «Детали». Тем не менее, кажется, что модальное всплыло бы , если бы оно не перемещалось.

Разметка строки таблицы:

<tr onclick="location.href = '@(Url.Action("Action", "Controller", new { id = item.ItemID }))'" class="inventory-row">
    ... <!-- Item Info -->
</tr>

Удалить кнопку разметки:

@Html.ActionLink("<i class='fas fa-trash-alt'></i>", "#", null, new { @class = "btn btn-danger", @data_toggle = "modal", @data_target = "#DeleteConfirmationModal" })

Пометка кнопки «Пробная / альтернативная»:

<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
    <i class="fas fa-pencil-alt"></i>
</button>

Моя цель - открыть простое "Вы уверены, что хотите удалить элемент?" модальный.

Как мне получить кнопку удаления, чтобы открыть модал начальной загрузки, сохраняя при этом функциональность, заключающуюся в том, что нажатие на строку таблицы переходит на страницу "Детали"?

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

В случае, если это помогает ... этот вопрос - как я получил кнопку редактирования (карандаш) для правильной работы, а этот вопрос - как я получаю модал для всплывающего окна? когда страница не перемещается.

EDIT:

Я считаю, что кнопка редактирования (карандаш) работает только потому, что она перемещается на страницу редактирования элементов, прежде чем элемент <tr> сможет перейти на страницу сведений. Кнопка «Удалить» («мусор») вызывает модал, вложенный в ту же страницу, что позволяет элементу <tr> перейти на страницу сведений.

Нужно ли пересматривать дизайн моего интерфейса? или возможно, чтобы все элементы, кроме последнего <td>, были активными, чтобы эффективно удалять конфликт из кнопок?

РЕДАКТИРОВАТЬ 2:

Вот ссылка на разметку для таблицы: ссылка

РЕДАКТИРОВАТЬ 3:

Метод удаления в контроллере:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    try
    {
        Item.RemoveItem(id);
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Итак, глядя на ваш код, поскольку у вас есть кнопка редактирования, вы должны добавить кнопку просмотра, удалить ссылку действия из тега <tr> и переместить ее на кнопку. это остановит переход страницы с событием onclick на всю строку. с помощью 3 кнопок справа пользователи могут знать, как нажимать, а не делать всю строку кликабельной.

EDIT:

Итак, я настроил следующее, как если бы это был MVC с загрузкой jQuery после нижнего колонтитула. Возникли проблемы с загрузкой скрипта на странице, так как это вызвало бы ошибку на кнопках с несколькими строками. Я никогда не был фанатом e.stopPropagation(), поскольку он всегда вызывал другие проблемы на страницах, но швы на этой единственной странице без вызова других jQuery должны работать. вот рабочий пример .

    <html>

    <head>
        <title>Parcel Sandbox</title>
        <meta charset="UTF-8" />
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
     crossorigin="anonymous">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
     crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">
    </head>

    <body>
        <table>
            <tbody>
                <tr onclick="location.href = 'https://www.google.com'" class="inventory-row">
                    <td>col 1</td>
                    <td>col 2</td>
                    <td>col 3</td>
                    <td>col 4</td>
                    <td>
                        <button type="button" class="btn btn-warning" data-toggle="modal" data-target="#DeleteConfirmationModal">
            <i class="fa fa-trash"></i>
          </button>
                    </td>
                    <td>
                        <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
            <i class="fa fa-trash"></i>
          </button>
                    </td>
                </tr>
                <tr onclick="location.href = 'https://www.google.com'" class="inventory-row">
                    <td>col 1</td>
                    <td>col 2</td>
                    <td>col 3</td>
                    <td>col 4</td>
                    <td>
                        <button type="button" class="btn btn-warning" data-toggle="modal" data-target="#DeleteConfirmationModal">
            <i class="fa fa-trash"></i>
          </button>
                    </td>
                    <td>
                        <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
            <i class="fa fa-trash"></i>
          </button>
                    </td>
                </tr>
            </tbody>
        </table>

        <!-- Modal -->
        <div class="modal fade" id="DeleteConfirmationModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">×</span>
            </button>
                    </div>
                    <div class="modal-body">
                        TEST TEXT...
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                        <button type="button" class="btn btn-primary">Save changes</button>
                    </div>
                </div>
            </div>


    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
             crossorigin="anonymous"></script>
            <script src="/src/index.js"></script>
    </body>

    </html>

Для сценария: поместите скрипт в его собственный файл, здесь у меня он есть в index.js. Включите это в макет под загрузкой скрипта jquery:

@RenderSection("Scripts",false/*required*/)

Включить файл в представление:

@section Scripts
{
  <script src="@Url.Content("~/Scripts/index.js")"></script>
}

index.js:

$(".btn-warning").click(function (e) {
  e.stopPropagation()
  let target = $(this).data('target')
  $(target).modal('show')
})
$(".btn-danger").click(function (e) {
  e.stopPropagation()
  let target = $(this).data('target')
  $(target).modal('show')
})
0 голосов
/ 15 мая 2018

Поскольку кнопка корзины находится внутри tr, вы можете попытаться обработать событие нажатия самой кнопки корзины и остановить распространение события вверх. Я предполагаю, что вы используете загрузчик, поэтому следующее решение использует jQuery. Это должно работать для button или ActionLink, но обычно, когда вы используете <a>, вы хотите использовать этот якорь href в качестве заполнителя для data-target. Я решил использовать button. Так в тебе html

<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
    <i class="fas fa-trash-alt"></i>
</button>

В вашем JavaScript:

$(document).ready(function() {
  $(".btn.btn-danger").click(function(e) {
    e.stopPropagation()
    let target = $(this).data('target')
    $(target).modal('show')
  })
})

Вот демоверсия:
https://www.bootply.com/paKZLt8L94

Как реализовать это в MVC
Добавьте маркер защиты от подделки в ваше представление (замените ControllerName ниже на Controller)

// The purpose of this form is to create a Anti-forgery token
// needed by the controller. Insert this anywhere in your html
@using (Html.BeginForm("DeleteConfirmed", "ControllerName", FormMethod.Post, new { id = "delete-forklift-form" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" id="forklift-Id" name="id" value="" /> 
}

Добавьте модальную разметку где-нибудь в поле зрения (в конце все в порядке)

<!-- Modal -->
<div class="modal fade" id="DeleteConfirmationModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">×</span>
        </button>
      </div>
      <div class="modal-body">
        Are you sure you want to delete this item?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button id="delete-confirm" type="button" class="btn btn-primary">Delete</button>
      </div>
    </div>
  </div>
</div>

Добавьте идентификатор элемента как data-attribute к своим кнопкам:

// We need this ID to be passed to the delete action
// This is the foreach statement in you view from the pastebin link
@foreach(var item in Model.ForkliftStockInventoryList)
{
    // ... rest of the stuff
    <button type="button" class="btn btn-danger" data-fid="@item.ForkliftID" data-toggle="modal" data-target="#DeleteConfirmationModal">
        <i class="fas fa-trash-alt"></i>
    </button>  
}

Оберните ваш JavaScript в блоке сценариев
Поместите модифицированный код JavaScript в конец вашего представления:

@section Scripts{
    <script>
        $(document).ready(function () {
            // handler for the trash button
            $(".btn.btn-danger").click(function (e) {

                e.stopPropagation()
                let target = $(this).data('target')
                let forkliftId = $(this).data('fid')
                // update the forklift to delete in the hidden field
                $('#forklift-Id').val(forkliftId)
                $(target).modal('show')
            })

            // handler for the delete confirmation on the modal
            $('#delete-confirm').click(function () {
                $('#delete-forklift-form').submit()
            })
        })
    </script>
}

В вашем представлении _Layout вы визуализируете jQuery после его использования, поэтому ни один из компонентов jQuery не работал. Нажмите @RenderSection("scripts", required: false) до конца, чтобы все сценарии в макете отображались перед сценариями в каждом представлении. Очень важно обернуть <script>...</script> в индексном представлении Forklift в блок Scripts (см. Выше)

Изменение

 @RenderSection("scripts", required: false)
    @*<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>*@
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script> 

К

 <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
    @RenderSection("scripts", required: false)
// RenderSection scripts at the end
0 голосов
/ 14 мая 2018

Эта разметка будет работать, но вам нужно указать этот модальный идентификатор:

<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
    <i class="fas fa-pencil-alt"></i>
</button>

Я не уверен, что вы пропустили удостоверение личности по ошибке ...

EDIT:

Понятно, я думаю, это потому, что вы используете <button>, и у меня была такая же проблема.

Попробуйте эту разметку:

<a href="#" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
    <i class="fas fa-pencil-alt"></i>
</a>

EDIT:

О, я понимаю, что вы имеете в виду, да, это ваше <tr> событие, которое срабатывает. Добавьте это к вашему событию нажатия кнопки: event.stopPropagation();

Документация: https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation

...