Нарушает ли это MVC в строгом смысле, да, наверное.Есть ли случаи, когда нарушать это не вредно?Конечно.Тем не менее, существуют механизмы, которые могут помочь вам и разделить проблемы.
Вы можете использовать ваши постоянные доменные объекты в представлениях и проверять их, но когда ваше представление становится сложным, ViewModels становятся необходимостью.Для мертвых простых доменных моделей или представлений только для просмотра (не редактирует / создает) я иногда немного выдумываю и отправляю их в представление как часть составного объекта:
class MyViewModel
{
public MyDomainModel DomainObj;
public int OtherViewInfo;
}
Однако для созданияи редактировать сценарии, ViewModels намного лучше.Они позволяют вам полностью контролировать данные, отправляемые в представление и из представления.
Если вы используете EF 4.1 и CodeFirst, то да, в итоге вы получите некоторое дублированиеатрибутов и свойств между доменом и ViewModel.Это неизбежно, но дает вам гибкость в выполнении различных проверок, специфичных для представления.
Я считаю полезным иметь один дополнительный уровень защиты в контроллере при фактическом сохранении объекта домена на случай, если я пропустил некоторыепроверка в представлении:
public class MyController : Controller
{
[HttpPost]
public ActionResult Edit(int id, MyViewModel model)
{
try
{
...Do stuff, check ModelState.IsValid...
_context.SaveChanges()
}
catch (DbEntityValidationException dbEx)
{
// Catch any validation errors on the domain that weren't duplicated
// in the viewmodel
ModelState.AddModelError("Form", dbEx);
}
return View(model);
}
}
Следующий вопрос, который нужно задать, - это как вы сопоставляете модель домена с моделью представления.Существует целый ряд стратегий и инструментов - AutoMapper и ValueInjecter (да, написано неправильно).Лично я использую ValueInjecter, хотя, если вы настроите слой отображения, вы можете попробовать оба.Я обнаружил, что ни один из них не будет работать в 100% случаев, или, по крайней мере, я мог бы понять, как делать то, что мне было нужно, но картографический сервис облегчает определение пользовательских карт слева направо.