Диалоговые окна и CRUD-интерфейс

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

В этой теме рассмотрим создание на основе виджета dialog из библиотеки jQuery UI CRUD-интерфейса, то есть создание, редактирование и удаление через диалоговые окна.

Итак, создадим новый проект ASP.NET MVC 5. И вначале добавим в проект через NuGet пакеты Entity Framework и jQuery UI, а также настроим подключение к базе данных.

И также определим класс модели, с которой мы будем работать:

public class Computer
{
    public int Id { get; set; }
	
	[Display(Name = "Модель")]
    public string Model { get; set; }
	
	[Display(Name = "Год выпуска")]
    public int Year { get; set; }
}

И добавим класс контекста данных:

public class CompContext : DbContext
{
    public DbSet<Computer> Computers { get; set; }
}

Затем изменим стандартный контроллер HomeController следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CRUDDialogApp.Models;
using System.Data.Entity;

namespace CRUDDialogApp.Controllers
{
    public class HomeController : Controller
    {
        CompContext db = new CompContext();
        public ActionResult Index()
        {
            return View(db.Computers);
        }
        // Просмотр подробных сведений о книге
        public ActionResult Details(int id)
        {
            Computer comp = db.Computers.Find(id);
            if (comp != null)
            {
                return PartialView("Details", comp);
            }
            return View("Index");
        }
        // Добавление
        public ActionResult Create()
        {
            return PartialView("Create");
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Computer comp)
        {
            db.Computers.Add(comp);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        // Редактирование
        public ActionResult Edit(int id)
        {
            Computer comp = db.Computers.Find(id);
            if (comp != null)
            {
                return PartialView("Edit", comp);
            }
            return View("Index");
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Computer comp)
        {
            db.Entry(comp).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        // Удаление
        public ActionResult Delete(int id)
        {
            Computer comp = db.Computers.Find(id);
            if (comp != null)
            {
                return PartialView("Delete", comp);
            }
            return View("Index");
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ActionName("Delete")]
        public ActionResult DeleteRecord(int id)
        {
            Computer comp = db.Computers.Find(id);

            if (comp != null)
            {
                db.Computers.Remove(comp);
                db.SaveChanges();
            }
            return RedirectToAction("Index");
        }
    }
}

Все методы представляют стандартные действия по добавлению/редактированию/удалению объектов. Их особенностью является лишь то, что они возвращают частичное представление.

Добавим все частичные представления. Частичное представление Create.cshtml:

@model CRUDDialogApp.Models.Computer
<div>
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
        <div>
            @Html.LabelFor(model => model.Model)
            <p>@Html.EditorFor(model => model.Model)</p>
        </div>

        <div>
            @Html.LabelFor(model => model.Year)
            <p>@Html.EditorFor(model => model.Year)</p>
        </div>
        <p><input type="submit" value="Добавить" /></p>
}
</div>

Частичное представление Edit.cshtml:

@model CRUDDialogApp.Models.Computer
<div>
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(model => model.Id)
        <div>
            @Html.LabelFor(model => model.Model)
            <p>@Html.EditorFor(model => model.Model)</p>
        </div>
        <div>
            @Html.LabelFor(model => model.Year)
            <p>@Html.EditorFor(model => model.Year)</p>
        </div>
        <p><input type="submit" value="Сохранить" /></p> 
    }
</div>

Частичное представление Details.cshtml:

@model CRUDDialogApp.Models.Computer
<div>
    <h3>Ид:  @Html.DisplayFor(m => m.Id)</h3>
    <p>Модель: @Html.DisplayFor(m => m.Model)</p>
    <p>Год выпуска: @Html.DisplayFor(m => m.Year)</p>
</div>

И частичное представление Delete.cshtml:

@model CRUDDialogApp.Models.Computer

<h3>Вы действительно хотите удалить данную модель?</h3>
<div>
    <p>Ид.: @Html.DisplayFor(m => m.Id)</p>
    <p>Модель: @Html.DisplayFor(m => m.Model)</p>
    <p>Год выпуска: @Html.DisplayFor(m => m.Year)</p>

    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()

        <input type="submit" value="Удалить" />   
    }
</div>

Все эти частичные представления будут встроены в главное представление Index.cshtml, которое мы изменим следующим образом:

@model IEnumerable<CRUDDialogApp.Models.Computer>
@{
    Layout = null;
}
<html>
<head>
    <title></title>
    <link href='@Url.Content("~/Content/themes/base/jquery-ui.css")' rel="stylesheet" type="text/css" />
</head>
<body>
    <h2>Список компьютеров</h2>
    <table>
    @foreach (var c in Model)
    {
        <tr><td>@c.Model</td><td>
        @Html.ActionLink("Смотреть", "Details", "Home", new { id = c.Id }, 
            new { @class = "viewDialog",  data_dialog_title = "Описание модели" }) | 
        @Html.ActionLink("Изменить", "Edit", "Home", new { id = c.Id }, 
            new { @class = "viewDialog", data_dialog_title = "Редактирование модели" }) |
        @Html.ActionLink("Удалить", "Delete", "Home", new { id = c.Id }, 
            new { @class = "viewDialog", data_dialog_title = "Удаление модели" }) </td></tr>
    }
    </table>
    <p> @Html.ActionLink("Добавить", "Create", "Home", new { }, new { @class = "viewDialog", data_dialog_title = "Создание модели" })</p> 

    <script src='@Url.Content("~/Scripts/jquery-1.12.4.min.js")' type="text/javascript"></script>
    <script src='@Url.Content("~/Scripts/jquery-ui-1.12.1.min.js")' type="text/javascript"></script>
    <script>
    $(document).ready(function () {

        $.ajaxSetup({ cache: false });

        $(".viewDialog").on("click", function (e) {
            e.preventDefault();

            $("<div></div>")
                .addClass("dialog")
                .appendTo("body")
                .dialog({
                    title: $(this).attr("data-dialog-title"),
					 close: function () { $(this).remove() },
                    modal: true
                })
                .load(this.href);
        });
    });
    </script>
</body>
</html>

Все ссылки имеют атрибут класса class="viewDialog", с помощью которого на эти ссылки прикрепляется обработчик нажатия $(".viewDialog").on("click", function (e).... А в обработчике происходит создание диалогового окна, которое будет содержать нужное частичное представление.

К примеру, нажмем на ссылку для добавления и попробуем добавить новый элемент:

CRUD-интерфейс в ASP.NET MVC 5

Подобным образом сработают и диалоговые окна для остальных ссылок.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850