Мало того, что ViewModels - единственные, которые СЛЕДУЕТ использовать в MVC. Они дают ряд преимуществ, и основными из них являются статическая типизация и проверка времени компиляции. ViewData и ViewBag используют уродливые строки и динамические имена свойств, которые сложно поддерживать и подвержены ошибкам. В asp.net MVC M обозначает ViewModel
s, а не доменные модели. Модели - это бизнес, доменные объекты, которые инкапсулируют бизнес-логику и предназначены для работы в домене. Модели остаются неизменными, несмотря на используемую технологию представления, будь то приложение Windows, Silverlight, ASP.NET MVC или другие. В отличие от этого, ViewModels в asp.net MVC - это классы, разработанные для работы в рамках MVC, они выполняют специфичные для контроллера и просматривают конкретные данные и позволяют упростить итерацию между моделями домена и контроллером. Например, при проектировании сущности пользователя в домене (модель)
public class User
{
public string UserName { get; set; }
public string Password { get; set; }
}
и при разработке контроллера входа в систему для вашего приложения - UserViewModel
public class UserViewModel
{
public string UserName { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
public string LoginHelpText { get; set; }
}
это не реальный пример, но вы должны увидеть основное отличие при разработке моделей представлений от моделей доменов. Как вы видите, ViewModels зависят от контроллера режима и действия и содержат данные для лучшего представления и итерации пользователя, в то время как доменные модели предназначены для работы в домене и не заботятся о представлении - для моделей домена никогда не требуется, например, второе поле ConfirmPassword. , Чтобы лучше использовать ViewModels с моделями доменов, вы можете взглянуть на AutoMapper и другие инструменты сообщества.
ViewModels не должна содержать ни логику доступа к данным для базы данных, ни бизнес-логику. В случае, Модели также не должны содержать доступ к базе данных. Для этого вам следует создать репозитории.
public interface IUserRepository
{
int Create(User user);
bool UserAlreadyExists(string userName);
bool UpdateUserDatas(User user);
}
//than the implementation
public class UserRepository
{
// Implementation of user repository.
}
//controller
public class UserController
{
IUserRepository _userRepository;
public UserController(IUserRepository userRepository)
{
_userRepository = userRepository ?? new UserRepository();// better to write this using Dependency Injection. Search google for Ninject, StructureMap, Unity, etc
}
public ActionResult Create(UserViewModel user)
{
if (ModelState.IsValid)
{
User domainUser = new User()
{
UserName = user.UserName // etc. written for simplicity, Use Automapper instead
};
_userRepository.Create(domainUser);// create user via repository
return RedirectToAction("Index");
}
return View(user);
}
}
Прочтите книгу Стивена Сандерсона про asp.net mvc 3 для полной информации