четверг, 21 июля 2011 г.

MVC - часть3. CRUD логика (Edit)


Давайте теперь попробуем сгенерировать страницу для редактирования объекта нашей карты.
Если изучить ссылки на редактирование в списке объектов, то можно обнаружить, что они все уникальны и содержат в себе идентификатор объекта карты. Вот этот идентификатор и будет «ловить» экшен, отвечающий за редактирование. Давайте приступим. Для начала нам нужен метод нашего MapDataManager, который бы отдавал нам объект карты по его идентификатору (листинг 1).
Листинг 1 – Получение объекта по его идентификатору
        public Map GetMapObjet(long mapObjId)
        {
            return _db.Map.SingleOrDefault(it => it.MapObj_id == mapObjId);
        }

Тут, думаю, все понятно. Едем дальше – пишем экшен для получения формы для редактирования объекта (листинг 2).
Листинг 2 – Получение формы для редактирования объекта
        [HttpGet]
        public ActionResult MapObject_Edit(long id)
        {
            DataManager dm = new DataManager();
           
            return View(dm.GetMapObjet(id));
        }

Тут мы передаем в представление объект карты, полученный по идентификатору. Напомню, что этот идентификатор «пришел» в экшен из ссылки на странице со списком объектов. Теперь нам надо зафиксировать наши изменения в БД при отправке формы. Для этого сначала «научим» MapDataManager сохранять объект в БД (листинг 3).
Листинг 3 – Сохранение объекта в БД
        public void SaveMapObject(Map mapObj)
        {
            Map old = GetMapObjet(mapObj.MapObj_id);

            old.ObjName = mapObj.ObjName;
            old.ObjAddress = mapObj.ObjAddress;
            old.ObjType = mapObj.ObjType;
            old.Description = mapObj.Description;
            old.Contact = mapObj.Contact;
            old.Longitude = mapObj.Longitude;
            old.Latitude = mapObj.Latitude;

            _db.SaveChanges();
        }

 Тут мы передаем в процедуру новый объект. Для фиксации его отредактированных свойств мы сначала ищем старый (нередактированный) объект – и по очереди обновляем все его свойства. Далее – сохраняем. Теперь напишем экшен пост-формы для этого дела (листинг 4).
Листинг 4 – Отправка формы с измененным объектом
        [HttpPost]
        public ActionResult MapObject_Edit(Map mapObj)
        {
            if (ModelState.IsValid)
            {
                DataManager dm = new DataManager();

                dm.SaveMapObject(mapObj);

                return RedirectToAction("Index");
            }
            else
            {
                return View();
            }
        }

Как говорится, без комментариев.
Если вы обратили внимание, мы наш экшен назвали  MapObject_Edit, в то время как в представлении со списком объектов студия обозвала этот экшен просто Edit, поэтому переименуйте эту ссылку вручную – и пользуйтесь.
Таким нехитрым способом буквально за пару минут мы создали страницу для редактирования объекта карты.



3 комментария:

Сергей комментирует...

Продолжение будет? Особенно интересует как можно из списка объектов перейти к карте с отображением только данного объекта на карте (маркера).
Так же очень интересно узнать, как не терять позицию и масштаб карты если пользователь уходит на другую страницу сайта, а затем возвращается к карте.

dedMazDie комментирует...

Кризис жанра пока. Но по Вашим вопросам постараюсь что то написать :)

dedMazDie комментирует...

Частично ответил -
http://dedmazdie.blogspot.com/2011/07/mvc-3-crud-detail.html