вторник, 7 февраля 2012 г.

MVC. Общаемся с БД

Идеология MVC - есть контроллер, который обрабатывает запросы, работает с моделью и генерирует представление, «вьюху». Там нету серверных контролов, форм, кнопок. Только view.
Создадим приложение, которое умеет добавлять новых авторов в нашу БД, редактировать уже имеющихся и удалять их.
Создаем ASP.NET MVC 3 Web Application.

Открываем файл «Web.config» и заменяем строку соединения, которая там есть, на строку соединения с нашей БД. (Как это сделать из самой студии – см здесь)
Ок, приложение есть. Теперь нам нужен ORM. Выбираем «Linq to SQL». (Аналогично тому, как мы делали раньше)
SolutionAdd - New Project
Создаем проект class Library – «Model». Выкидываем оттуда дефолтный класс «Class1.cs». Вместо него добавляем «LINQ to SQL Classes». Назовем его «Books.dbml». Открываем его, открываем Server Explorer. Разворачиваем таблички нашей БД, выделяем нужные и перетаскиваем на форму.
Возвращаемся в Web Application. Добавляем проект «Model» в «References».
И создаем новый контроллер (ControllersAddController) с пустыми actions. Назовем его «AuthorController».

Заполняем его. Каждый метод повторяем дважды - для get запроса и post запроса.
Get запрос идет, когда мы открываем url адрес. Пусть он возвращаем нам некую view

Post запрос идет, в нашем случае, при submit-e формы.
Создадим эту форму: В папке «Views» создаем папку «Author», в которую уже добавляем view с названием «Create». Расписываем ее:

Символ «@» означает, что за ним идет код C#, который Razer обработает и выполнит. Razer  - движок для создания view.
ViewBag.Title = "Добавление";

Это – название самого окна в браузере. Далее идет описание формы и ее параметров. Параметр method - тот метод протокола HTTP, по которому будут переданы параметры на сервер (в нашем случае – POST), action – куда буду отправлены данные.

При создании нового автора нам необходимо ввести ему имя и фамилию (id, напомню, генерится само – это автоинкрементальное поле в нашей БД). Соответственно, указываем внутри формы два input-a типа «тект», добавив к ним лейблы в качестве описания поля.
<br/> - пустая строка (грубо говоря)
В конце формы указываем волшебный input с типом «submit» - он отправляет данные по тому методу, который мы указали. То есть инициирует POST запрос. При сабмите формы мы получаем коллекцию с параметрами, которые ввел клиент на форме.

А что мы хотим от POST запроса? Мы хотим добавить введенного на клиенте автора в Базу Данных! А для этого нам надо послать запрос к БД в виде операции, которую мы делаем внутри транзакции, а для работы с транзакцией нам необходимо открыть соединение. Во как.


Внутри транзакции создаем новый объект класса «Автор» (он сгенерился в Модели, когда мы перетащили в дизайнер табличку авторов).
Далее мы присваиваем этому автору значения из коллекции.

db.Authors.InsertOnSubmit(a);
db.SubmitChanges();

Вставляем автора в Базу Данных и сабмитим изменения – сохраняем их.
После чего возвращаемся на главную страницу – Index.

Если блок «try» не прошел успешно, то возвращаем ту же самую View – остаемся на форме.

Рассмотрим дефолтную страницу – View «Index»


























@model IList<Books.Model.Author> - говорим о том, что будем работать со списком объектов типа «Автор»

«table» - таблица
«thead» - заголовок таблицы
«th» - колонки в заголовке
«tbody»- тело таблицы
«tr» - строки

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

<td>@Html.ActionLink("Редактировать", "Edit", new {id = a.id})</td>


Сам метод edit:

Get


Author a = db.Authors.Single(p => p.id == id);

Этот код идентичен такому:



Post запрос метода Edit:


Метод «Delete» аналогично. Get такой же, в теле транзакции в POST запросе:
 Author a = db.Authors.Single(p => p.id == id);
 db.Authors.DeleteOnSubmit(a);
 db.SubmitChanges();
 tran.Complete();
 return RedirectToAction("Index");

Вьюхи:













Все, запускаем наше приложение и любуемся результатом J

6 комментариев:

  1. Здравствуйте, у меня когда прописываешь в транзакции подчеркивает books.Model. Вроде подключила класс этот правильно

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Желательно побольше информации :) В какой момент подчеркивает, что при этом говорит(студия + решарпер = мощное средство отладки)?

      Удалить
    2. Решарпер не поставила, к сожалению. Но при создании Linq to Sql, в транзакции в выпадающем списке не нет его

      Удалить
    3. Bumbon, правильно ли я понимаю, что Вы не можете найти свою табличку БД на шаге "Назовем его «Books.dbml». Открываем его, открываем Server Explorer. Разворачиваем таблички нашей БД, выделяем нужные и просто перетаскиваем на форму." в статье http://okiseleva.blogspot.ru/2012/02/web-application.html ?
      Если да, то надо просто нажать на "добавить соединение" и добавить соединение с БД.

      Если нет, опишите, пожалуйста, подробнее, а то не очень понятно, о каком выпадающем списке речь :)

      Удалить
  2. 'var db = new Books.Model.BooksModelDataConrext...'
    вот в этой строчке у меня не выпадает Books.Model, хотя все ранее делала по примеру

    ОтветитьУдалить
    Ответы
    1. Ох, давно это все было) Напишите мне, пожалуйста, на почту, пришлите свой проект - ok.molechka@gmail.com

      Посмотрю прямо на примере :)

      Удалить