Невозможно открыть модальное всплывающее окно Bootstrap из частичного представления - PullRequest
0 голосов
/ 14 марта 2019

У меня есть веб-сетка со столбцом гиперссылки, и после нажатия на эту ссылку она должна открыть модальное всплывающее окно. У меня есть модальное имя с именем #examplemodal в частичном представлении с именем «GetDetails».Ниже я пытаюсь открыть модальный из метода действия контроллера, который возвращает частичное представление.

 @Html.ActionLink("OrderNumber","GetDetails","Home",
                  new{id = item.ID}, new{data_target="#exampleModal", data_toggle="modal", @class="modal-backdrop"});

Когда я нажимаю на ссылку с Ordernumber, экран затемняется, и я вообще не вижу сетку.Любые указатели на то, где я делаю ошибку.Я использую asp.Net mvc5 и bootstrap v4.3.1

1 Ответ

2 голосов
/ 15 марта 2019

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

Если это так, то модем начальной загрузки не подходитинструмент для вас.Он предназначен для загрузки статического контента.Если вы хотите загрузить динамический контент, то есть детали заказа для разных номеров заказа, вам следует обратиться к концепции под названием iframe и таким библиотекам, как Fancybox и т. Д.

Вот что я хотел бы сделать:

1. Определить модальное расположение

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

<!-- _PopupLayout.cshtml -->

<!DOCTYPE html>
<html>
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />

        <!-- All your necessary styles, meta data, etc -->

        <title>...</title>

        @RenderSection("css", required: false)
    </head>
    <body>
        <main class="container-fluid">
            @RenderBody()
        </main>

        <!-- All your necessary javascripts -->

        @RenderSection("scripts", required: false)
    </body>
</html>

2. Возвратные представления, использующие _PopupLayout

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

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

@model ...
@{
    ViewData["Title"] = "Order Details";
    Layout = "~/Views/Shared/_PopupLayout.cshtml";
}

<div class="modal-header">
    <h5 class="modal-title">Order Details</h5>
</div>
<div class="modal-body">
    ...
</div>

3.Написать JavaScript для запуска FancyBox при нажатии ссылки

Вы можете использовать собственный класс css для селектора для всех ссылок, из которых вы хотите загрузить iframe.В моем случае я называю это .popup-fancy.Вы также можете определить несколько классов для отображения разных размеров модальных / модных коробок.

$(function() {
    $().fancybox({
        selector: 'a.popup-fancy',
        defaultType: 'iframe',
        baseClass: 'fancybox-md',
        iframe: {
            preload: false
        },
        arrows: false,
        infobar: false,
        smallBtn: true
    });

    $().fancybox({
        selector: 'a.popup-fancy-lg',
        defaultType: 'iframe',
        baseClass: 'fancybox-lg',
        iframe: {
            preload: false
        },
        arrows: false,
        infobar: false,
        smallBtn: true
    });

    $().fancybox({
        selector: 'a.popup-fancy-xl',
        defaultType: 'iframe',
        baseClass: 'fancybox-xl',
        iframe: {
            preload: false
        },
        arrows: false,
        infobar: false,
        smallBtn: true
    });
});

Посмотрите, как он устанавливает тип по умолчанию iframe ?Вы можете найти эти параметры конфигурации в документации Fancybox.Чтобы не забыть эти 3 стиля базовых классов (я использую Sass):

.fancybox-md {
    .fancybox-content {
        max-width: 36.75rem;
    }
}

.fancybox-lg {
    .fancybox-content {
        max-width: 65.625rem;
    }
}

.fancybox-xl {
    .fancybox-content {
        max-width: 78.75rem;
    }
}

4.Создать ссылки для открытия модальных

Теперь вы можете создавать ссылки с любым из этих классов триггеров fancybox.:

<a href="@Url.Action("details", "order", new { area = "", id = item.Id })"
    class="popup-fancy">
    See Order Details
</a>

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

Например:

enter image description here

Если вы можете использовать только начальную загрузкумодальный ??

В этом случае вам придется создать модальный шаблон (возможно, в макете, чтобы его можно было вызывать где угодно) с iframe внутри.И затем по ссылке, которую вы нажали, вы используете javascript, чтобы установить источник iframe и вручную открыть модал.

Образец модального шаблона

<div id="fancy-modal" class="modal fade" tabindex="-1" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
            <iframe src="" frameborder="0"></iframe>
        </div>
    </div>
</div>

Затем на странице, где вы генерируете ссылки,вместо того, чтобы генерировать реальные ссылки, вы должны будете сгенерировать модальные триггеры:

<a href="#" class="fancy-modal-trigger"
    data-iframe-src="@Url.Action("details", "order", new { area = "", id = item.Id })">
    See Order Details
</a>

Смотрите здесь, вы ставите фактическую ссылку на ваше представление на data-attribute вместо href, потому что вы не делаетехотите, чтобы ссылка действительно перемещалась к месту назначения.

$(function() {
    $('a.fancy-modal-trigger').click(function() {
        let iframeSrc = $(this).data('iframe-src'),
            $fancyModal = $('#fancy-modal');

        $fancyModal.find('iframe').prop('src', iframeSrc);
        $fancyModal.modal('show');

        return false;
    });
});

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это еще не проверено.

...