Сохранить после редактирования кода улучшения - PullRequest
0 голосов
/ 25 октября 2011

Я работаю над простым приложением и пытаюсь разобраться в подходе CodeFirst EF. Пока все хорошо.

Мне удалось получить Создать и удалить отсортированные и получил редактирование работает. Дело в том, что я думаю, что код редактирования можно улучшить; Я просто не знаю как. Итак, вот оно:

 public ActionResult Edit(int id, CreateResourceViewModel model)
        {
            if (ModelState.IsValid)
            {
                // save the changes
                //UpdateModel(model.Resource);
                //resourceAdminManager.SaveChanges();

                Resource current = resourceAdminManager.Resources.Find(id);
                current.ResourceTypeID = model.Resource.ResourceTypeID;
                current.Name = model.Resource.Name;
                current.Description = model.Resource.Description;
                current.Email = model.Resource.Email;
                current.TurnAroundTime = model.Resource.TurnAroundTime;


                resourceAdminManager.SaveChanges();

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

Я знаю, что здесь нет обработки исключений, и мне нужно учесть это, но моя главная проблема в том, что я вручную обновил модель. Мои опасения: 1. это в контроллере 2. Это жестко запрограммировано, поэтому любые изменения в модели потребуют доработки кода

Может кто-нибудь предложить лучший способ сделать это, пожалуйста.

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

Итак, следуя предложениям AutoMapper:

Это очень полезно, и я начал играть с этим. У меня небольшие проблемы с этим.

Контроллер теперь выглядит так:

if (ModelState.IsValid)
            {
                try
                {
                    var current = resourceAdminManager.Resources.Find(id);
                    current = Mapper.Map<CreateResourceViewModel, Resource>(model);
                    resourceAdminManager.SaveChanges();
                    return RedirectToAction("Index");
                }
                catch (Exception exc)
                {
                    ModelState.AddModelError("Error", exc); // or, use a generic error.
                }
            }

            return View(model);

Ошибка появляется в представлении, когда я нажимаю сохранить. Я получаю нулевое исключение в следующих случаях:

<%: Html.DropDownListFor(model => model.Resource.ResourceTypeID, new SelectList(Model.ResourceTypes, "ResourceTypeId", "Title"), "-- Select Resource Type --")%>

Есть идеи о том, чего мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Одно слово: AutoMapper .

Превратит эти пять линий слева направо в одну.

Одна из лучшихНадстройка MVC (ну, C #), которую я когда-либо нашел.

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

public ActionResult Edit(int id, CreateResourceViewModel model)
{
   if (ModelState.IsValid) 
   {   
      try
      {
         var current = resourceAdminManager.Resources.Find(id);
         current = Mapper.Map<CreateResourceViewModel,Resource>(model);
         resourceAdminManager.SaveChanges();
         return RedirectToAction("Index");
      }
      catch (Exception exc)
      {
         ModelState.AddModelError("Error", exc); // or, use a generic error.
      }
   }

   return View(model);

}

Предупреждение: это в основном заменит всю сущность.Поэтому, если вы хотите, чтобы только определенные поля были изменены, включите только те в ViewModel, чтобы другие не изменились.Вы также можете указать «Игнорировать» в AutoMapper, чтобы эти поля не были затронуты.

И для решения ваших проблем:

  1. Это в контроллере

Ну, на самом деле, это должно быть.Фактически, это работа контроллеров - обновление модели.Тот факт, что у вас есть стандартный код LR, является плохим, поэтому AutoMapper помогает.

  1. Это жестко запрограммировано, поэтому любые изменения в модели потребуют доработки кода

Да, опять же - AutoMapper решает эту проблему.Он работает по соглашению (например, MVC), поэтому, если у вас есть свойство в ViewModel с тем же именем, что и у целевой модели (объект домена), вам не нужно явно отображать -> это будет просто работать.Кроме того, отображение представляет собой один статический класс, поэтому его легко поддерживать.

0 голосов
/ 25 октября 2011

Вы используете ViewModel, что очень хорошая практика.

1] Для обработки исключений предложит наследовать ваш контроллер из вашего пользовательского "BaseControllor" вместо System.Web.Mvc.Controller

public class YourController : BaseController

В «BaseControllor» переопределите OnException, чтобы все исключения в ваших действиях Controllor были уловлены.

public class BaseController: Controller
{

    protected override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);
    }

}

2] Вам необходимо преобразовать код «Сохранить» в другой класс в том же проекте или в другом проекте и в другой класс

3] Да, для любых изменений в модели вам потребуется внести изменения в viewmodel и в логику сохранения

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