Я по-прежнему новичок в ASP.NET MVC 3. Я столкнулся с моделями взглядов и их использованием для передачи данных с контроллера на представление. В моем недавнем question on model binding два эксперта предположили, что я должен также использовать модели представления для привязки к модели.Привязка модели к контроллеру при отправке формы - зачем использовать модель представления вместо класса из модели домена?
Это то, с чем я не сталкивался раньше. Но оба парня заверили меня, что это лучшая практика. Может кто-то может пролить свет на причины, по которым модели просмотра более подходят для привязки к модели?
Вот пример ситуации: У меня есть простой класс в моей модели домена.
public class TestParent
{
public int TestParentID { get; set; }
public string Name { get; set; }
public string Comment { get; set; }
}
И это мой контроллер:
public class TestController : Controller
{
private EFDbTestParentRepository testParentRepository = new EFDbTestParentRepository();
private EFDbTestChildRepository testChildRepository = new EFDbTestChildRepository();
public ActionResult ListParents()
{
return View(testParentRepository.TestParents);
}
public ViewResult EditParent(int testParentID)
{
return View(testParentRepository.TestParents.First(tp => tp.TestParentID == testParentID));
}
[HttpPost]
public ActionResult EditParent(TestParent testParent)
{
if (ModelState.IsValid)
{
testParentRepository.SaveTestParent(testParent);
TempData["message"] = string.Format("Changes to test parents have been saved: {0} (ID = {1})",
testParent.Name,
testParent.TestParentID);
return RedirectToAction("ListParents");
}
// something wrong with the data values
return View(testParent);
}
}
Таким образом, в третьем способе действий, который вызывается, когда POST HTTP прибывает я TestParent для связывания модели. Это было довольно удобно, потому что страница браузера, которая генерирует запрос HTTP POST, содержит поля ввода для всех свойств TestParent. И я на самом деле думал, что так работают шаблоны, которые Visual Studio предоставляет для операций CRUD.
Однако рекомендация, которую я получил, заключалась в том, что подпись третьего метода действия должна читать public ActionResult EditParent(TestParentViewModel viewModel)
.
IMO, используя модель или модель, зависит от ситуации. Если на странице используются только атрибуты конкретной модели, я думаю, что это нормально, чтобы строго набрать представление этой модели и продолжить. Если, однако, есть какой-то элемент, который не является изначально частью модели, то именно здесь появляется модель просмотра. Создание viewmodel только для представления модели для вида вида побеждает концепцию DRY-кода. Это одна из тех концепций, где, если вы спросите 10 разработчиков, вы получите 12 ответов.Нижняя линия с использованием модели не (насколько мне известно) нарушает концепцию MVC. – Brian