Шаблоны формирования

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

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

Так как большинство приложений так или иначе основываются на стандартных CRUD-операция (Create - Read - Update - Delete), то зачастую разработчики вынуждены многократно создавать контроллеры и представления для одних и тех же действий: добавления, изменения, удаления и просмотра записей из БД. И чтобы облегчить разработчикам жизнь, команда MVC добавила такую полезную функциональность, как шаблоны формирования (scaffolding templates). Эти шаблоны позволяют по заданной модели и контексту данных сформировать весь необходимый базовый код контроллеров, а также всю разметку для представлений, с помощью которых можно управлять записями в БД.

Чтобы воспользоваться данной функциональностью, добавим новый контроллер. Нажмем правой кнопкой мыши на папку Controllers и выберем Add -> Controller.... Далее в окне добавления нового контроллера нам будет предложено выбрать шаблон контроллера:

scaffolding templates в asp.net mvc 5

Собственно к MVC относятся только первые три шаблона:

  • MVC 5 Controller - Empty. Этот шаблон добавляет в папку Controllers пустой контроллер, который имеет один единственный метод Index. Данный шаблон не создает представлений

  • MVC 5 Controller with read/write actions. Данный шаблон добавляет в проект контроллер, который содержит методы Index, Details, Create, Edit и Delete. Однако эти методы не содержат никакой логики работы с базой данных. И нам предлагается самим создать для них код и представления.

  • MVC 5 Controller with views, using Entity Framework. Это уже более интересный шаблон, который создает контроллер с методами Index, Details, Create, Edit и Delete, а также все необходимые представления для этих действий и добавляет код для извлечения информации из базы данных.

Выберем последний пункт, то есть MVC 5 Controller with views, using Entity Framework.

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

  • Controller name: имя контроллера

  • Use async controller actions: будут ли автоматические сгенерированные методы контроллера асинхронными. Установим данную опцию.

  • Model class: класс модели. Выберем созданную ранее модель Book (либо какую-то другую имеющуюся модель)

  • Data context class: класс контекста данных. Выберем контекст данных для выбранной модели.

  • Generate views: надо ли генерировать представления к создаваемым действиям контроллера. При установке этой опции становятся доступными две следующие опции. Установим все эти опции.

  • Reference script libraries: будут ли подключать представления библиотеки jquery и другие необходимые файлы javascript

  • Use a layout page: будут ли генерируемые представления использовать мастер-страницу

Установив все опции, нажмем кнопку Add, и в проект будет добавлен новый контроллер. Он будет выглядеть примерно следующим образом:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
using System.Web;
using System.Web.Mvc;
using BookStore.Models;

namespace BookStore.Controllers
{
    public class BookController : Controller
    {
        private BookContext db = new BookContext();

        public async Task<ActionResult> Index()
        {
            return View(await db.Books.ToListAsync());
        }

        public async Task<ActionResult> Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Book book = await db.Books.FindAsync(id);
            if (book == null)
            {
                return HttpNotFound();
            }
            return View(book);
        }

        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Create([Bind(Include="Id,Name,Author,Price")] Book book)
        {
            if (ModelState.IsValid)
            {
                db.Books.Add(book);
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }

            return View(book);
        }

        public async Task<ActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Book book = await db.Books.FindAsync(id);
            if (book == null)
            {
                return HttpNotFound();
            }
            return View(book);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit([Bind(Include="Id,Name,Author,Price")] Book book)
        {
            if (ModelState.IsValid)
            {
                db.Entry(book).State = EntityState.Modified;
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            return View(book);
        }

        public async Task<ActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Book book = await db.Books.FindAsync(id);
            if (book == null)
            {
                return HttpNotFound();
            }
            return View(book);
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> DeleteConfirmed(int id)
        {
            Book book = await db.Books.FindAsync(id);
            db.Books.Remove(book);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

А в папке Views/Book мы найдем все необходимые представления со всем необходимым кодом, который теперь нам не надо набирать вручную. И теперь мы можем запустить проект и перейти в адресной строке браузера к нашему контроллеру:

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

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