не знаю, правильно ли создавать валидацию для viewmodel, потому что у меня есть своя собственная сущность, так как я могу это сделать?
Лично я определяю свободныйвалидаторы для моих моделей зрения.Они содержат правила проверки для простых вещей, таких как требуемые свойства, форматы и т. Д., Чтобы эти проверки могли обрабатываться непосредственно в представлении.
Модели предметной области также могут содержать проверки, но это будут проверки бизнеса.Вот обычный процесс действия контроллера POST:
[HttpPost]
public ActionResult Insert(UpdateViewModel viewModel)
{
if (!ModelState.IsValid)
{
// the surface validation on our view model failed => redisplay the view so
// that the user can fix errors
return View(viewModel);
}
// at this stage the view model is valid => we can map it back to a domain model
// I use AutoMapper for this:
var domainModel = Mapper.Map<UpdateViewModel, DomainViewModel>(viewModel);
// then we pass the domain model to the service layer for processing:
string error;
if (!_service.Insert(domainModel, out error))
{
// something wrong happened on the service layer
ModelState.AddModelError("key", error);
return View(viewModel);
}
// everything went fine
return RedirectToAction("Success");
}
Как вы можете видеть из этого примера, мы делегируем обработку уровню обслуживания.Способ реализации этого сервиса не представляет интереса или смысла для приложения ASP.NET MVC.Вы можете использовать NHibernate, Entitiy Framework, вызывать некоторые другие сервисы на все, что только можете придумать, все, что нас должно волновать, - это то, что мы обрабатываем нашу модель домена, готовую к обработке, и она сообщает нам об ошибках, если таковые имеются.То, как вы обрабатываете свою проверку на сервисном уровне, также не имеет значения для приложения ASP.NET MVC => вы могли бы использовать Castle Validator, Fluent Validation, аннотации данных, что угодно ...
Насколькочто касается сопоставления, то может быть дополнительный шаг, если, например, вы обновляете существующую сущность домена.В этом случае модель представления, вероятно, не содержит все свойства модели предметной области, потому что в этом конкретном представлении, например, мы разрешаем редактировать только некоторые свойства.В этом случае поток будет выглядеть так:
// Fetch the original domain model we want to update
var domainModel = _service.Get(viewModel.Id);
// Update only the properties that are present on the view:
Mapper.Map<UpdateViewModel, DomainViewModel>(viewModel, domainModel);
// Pass to the service layer for processing:
string error;
if (!_service.Update(domainModel, out error))
{
...
}