Что является более правильным: использование UpdateModel () или получение модели в качестве параметра? - PullRequest
7 голосов
/ 17 июля 2009

Я видел множество примеров действий создания в статьях, книгах и примерах. Кажется, есть два распространенных стиля.

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create(FormCollection collection)
 {
     try
     {
         var contact = Contact.Create();
         UpdateModel<Contact>(contact);
         contact.Save();
         return RedirectToAction("Index");
     }
     catch (InvalidOperationException ex)
     {
         return View();
     }
 }

И ...

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create([Bind(Exclude="Id")]Contact contact)
 {
     try
     {
         contact.Save();  // ... assumes model does validation
         return RedirectToAction("Index");
     }
     catch (Exception ex)
     {
         // ... have to handle model exceptions and populate ModelState errors
         // ... either here or in the model's validation
         return View();
     }
 }

Я пробовал оба метода, и у обоих есть свои плюсы и минусы, ИМО.

Например, при использовании версии FormCollection мне приходится иметь дело с «Id» вручную в моем связывателе модели, так как здесь Bind / Exclude не работает. С типизированной версией метода я вообще не могу использовать связыватель модели. Мне нравится использовать связыватель модели, поскольку он позволяет мне заполнять ошибки ModelState, не имея сведений о ModelState в коде проверки моей модели.

Есть идеи?

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

Ответы [ 4 ]

3 голосов
/ 17 июля 2009

Используйте UpdateModel, если вы хотите обновить уже существующий объект модели, который вы можете получить из базы данных, или вы хотите создать экземпляр объекта модели каким-то конкретным способом

например:

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult EditEmployee(int id, FormCollection collection)
    {

try
     {

    Contact contact = repository.getContact(id);
    UpdateModel(contact, collection.ToValueProvider());
    repository.save();
    return RedirectToAction("Index");

}

    catch
    {
    //Handle 
    return View();
    }

}

Если у вас нет вышеуказанных требований, укажите его в качестве параметра действия.

2 голосов
/ 17 июля 2009

Что ж, после некоторого размышления я обнаружил, что должно было быть очевидным: передача модели в качестве параметра просто приводит к тому, что механизм связывания модели по умолчанию используется за кулисами. Так как это была моя главная причина не использовать версию со строгим шрифтом, я думаю, что сейчас нет причин этого не делать.

Кроме того, мой код должен выглядеть следующим образом:

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Create([Bind(Exclude="Id")]Contact contact)
 {
     if(!ModelState.IsValid)
         return View();

     contact.Save();
     return RedirectToAction("Index");
 }
1 голос
/ 15 марта 2013

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

Это далеко легче передать объект модели из вашего модульного теста, чем пытаться смоделировать весь HttpContext для предоставления данных, которые будут обновлены UpdateModel.

Даже в случае, когда вы хотите обновить существующую модель сущностей, вы все равно должны использовать этот шаблон, вводя модель представления :

[HttpPost]
public ActionResult Edit(int id, EditContactViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        Contact contact = _db.GetContact(id)

        contact.Name = viewModel.Name;

        _db.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(viewModel);
}
0 голосов
/ 17 июля 2009

Нет правильных или неправильных стилей. Если DefaultModelBinder соответствует вашим потребностям - всегда используйте строго типизированную версию. Если вы не можете использовать DefaultModelBinder - выберите между созданием пользовательского ModelBinder или использованием FormCollection параметра действия.

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