Какой лучший способ вызвать модальное диалоговое окно в ASP.NET MVC с помощью Twitter Bootstrap? - PullRequest
23 голосов
/ 11 ноября 2011

В настоящее время я использую Twitter Bootstrap toolkit для нового проекта, и у меня возник вопрос о том, как использовать модальное диалоговое окно в ASP.NET MVC3.

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

Ответы [ 4 ]

56 голосов
/ 11 октября 2012

Вот мое небольшое руководство, которое демонстрирует модальное диалоговое окно Twitter Bootstrap (2.x), которое работает с формами и частями в ASP.Net MVC 4.

Чтобы загрузить подобный проект, но нацеленный на MVC 5.1 и Bootstrap 3.1.1, пожалуйста, посетите этот сайт .

Начните с пустого интернет-шаблона MVC 4.

Добавить ссылку на Bootstrap с помощью NuGet

В App_Start / BundleConfig.cs добавьте следующие строки:

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/bootstrap.js"));
bundles.Add(new StyleBundle("~/Content/bootstrap").Include(
                    "~/Content/bootstrap.css",
                    "~/Content/bootstrap-responsive.css"));

In Views / Shared / _Layout.cshtml измените строку @ styles.Render так, чтобы она выглядела так:

@Styles.Render("~/Content/css", "~/Content/themes/base/css",  "~/Content/bootstrap")

и строка @ Scripts.Render:

@Scripts.Render("~/bundles/jquery", "~/bundles/jqueryui",  "~/bundles/bootstrap")

Пока у нас есть Bootstrap, подготовленный для работы с MVC 4, поэтому давайте добавим простой класс модели MyViewModel.cs в папку / Models:

using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    public class MyViewModel
    {
        public string Foo { get; set; }

        [Required(ErrorMessage = "The bar is absolutely required")]
        public string Bar { get; set; }
    }
}

В HomeController Добавьте следующие строки:

using MvcApplication1.Models;
//...

    public ActionResult Create()
    {
        return PartialView("_Create");
    }

    [HttpPost]
    public ActionResult Create(MyViewModel model)
    {
        if (ModelState.IsValid)
        {
            try
            {
                SaveChanges(model);
                return Json(new { success = true });
            }
            catch (Exception e)
            {
                ModelState.AddModelError("", e.Message);
            }

        }
        //Something bad happened
        return PartialView("_Create", model);
    }


    static void SaveChanges(MyViewModel model)
    {
        // Uncommment next line to demonstrate errors in modal
        //throw new Exception("Error test");
    }

Создайте новый частичный вид в папке Views / Home и назовите его _Create.cshtml:

@using MvcApplication1.Models
@model MyViewModel

<div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="myModalLabel">Create Foo Bar</h3>
</div>

@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { @class = "modal-form" }))
{
@Html.ValidationSummary()

<div  class="modal-body">
    <div>
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
        @Html.ValidationMessageFor(x => x.Foo)
    </div>
    <div>
        @Html.LabelFor(x => x.Bar)
        @Html.EditorFor(x => x.Bar)
        @Html.ValidationMessageFor(x => x.Bar)
    </div>
</div>

<div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Undo</button>
    <button class="btn btn-primary" type="submit">Save</button>
</div>

}

В файле Home / Index.cshtml удалите содержимое по умолчанию из шаблона и замените его следующим:

@{
    ViewBag.Title = "Home Page";
}

<br />
<br />
<br />

@Html.ActionLink("Create", "Create", null, null, new { id = "btnCreate", @class = "btn btn-small btn-info" })

<div id='dialogDiv' class='modal hide fade in'>
    <div id='dialogContent'></div>
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")

<script type="text/javascript">
    $(function () {

        //Optional: turn the chache off
        $.ajaxSetup({ cache: false });

        $('#btnCreate').click(function () {
            $('#dialogContent').load(this.href, function () {
                $('#dialogDiv').modal({
                    backdrop: 'static',
                    keyboard: true
                }, 'show');
                bindForm(this);
            });
            return false;
        });
    });

    function bindForm(dialog) {
        $('form', dialog).submit(function () {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    if (result.success) {
                        $('#dialogDiv').modal('hide');
                        // Refresh:
                        // location.reload();
                    } else {
                        $('#dialogContent').html(result);
                        bindForm();
                    }
                }
            });
            return false;
        });
    }

</script>
}

Если вы запустите свое приложение, после нажатия кнопки «Создать» на домашней странице появится красивый модальный Bootstrap.

Попробуйте раскомментировать строку SaveChanges() //throw в HomeController.cs, чтобы убедиться, что обработанные ошибки вашего контроллера будут правильно отображаться в диалоговом окне.

Я надеюсь, что в моем примере проясняется весь процесс включения Bootstrap и создания модалов в приложении MVC.

2 голосов
/ 07 сентября 2016

Отличный пример, мне пришлось немного изменить MVC 5 и Bootstrap 3.3.7, я изменил целевые теги div на следующие, в противном случае я просто получал серый фон и никакой модальный диалог.Надеюсь, это кому-нибудь поможет.

<div id='dialogDiv' class='modal fade' tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div id='dialogContent'></div>
        </div>
    </div>
</div>
1 голос
/ 14 сентября 2014

Спасибо @zjerry, решение отличное, но проверка jQuery не работает, для исправления необходимо изменить функцию bindForm следующим образом:

function bindForm(dialog) {
        $.validator.unobtrusive.parse('form');
        $('form', dialog).submit(function () {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    if (result.success) {
                        $('#dialogDiv').modal('hide');
                        // Refresh:
                        // location.reload();
                    } else {
                        $('#dialogContent').html(result);
                        bindForm();
                    }
                }
            });
            return false;
        });
    }

Обратите внимание на первую строку функции, потому чтоформа загружается после инициализации проверки jQuery.

Большое спасибо

0 голосов
/ 13 января 2012

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

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

Обычно на обычном веб-сайте вы хотите сохранить этот шаблон внутри функции создания js, чтобы вам не приходилось каждый раз отправлять файл пользователю через http, и он может иметь его.кэшируются.

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