使用ViewModel是否有意义

HW9*_*W90 2 model-view-controller asp.net-mvc asp.net-mvc-3

我在MVC3编程中尝试自己.在查看示例应用程序的过程中,我经常会看到模型,视图和控制器之外的ViewModel之类的东西.

我的问题:使用它们是否有意义?如果是:如何和模型和ViewModel之间的区别?

非常感谢!

编辑:谢谢你的回答:

这意味着如果我有一个模型用户:

public string Username {get;set;}
public string mail{get;set;}
public string password{get;set;}
public string gender {get;set;}

And some methods like:
public int instertUserToDb()
{
...
}
public bool UserAllreadyExists()
{
...
}
public bool UpdateUserDatas()
{
...
}
Run Code Online (Sandbox Code Playgroud)

Viewmodel不包含与数据库的任何连接?我需要创建一个ViewModel:NewUser,UpdateUser,UserDetails?

将所有诸如插入,选择等内容放入模型中并将ViewModel用作视图的模板是否正确?有没有人知道互联网上的一个好例子?

非常感谢!

arc*_*hil 8

不仅有意义,ViewModels是唯一应该在MVC中使用的.它们提供了许多好处,其中主要是静态类型和编译时间检查.ViewData和ViewBag依赖于丑陋的字符串和动态属性名称,这些名称很难维护且容易出错.在asp.net MVC中,M代表ViewModels,而不是域模型.模型是业务,域实体,它封装了业务逻辑,旨在在域内工作.尽管使用了演示技术,模型保持不变,无论是Windows应用程序,Silverlight,ASP.NET MVC还是其他.相比之下,asp.net MVC中的ViewModels是专为在MVC框架内工作而设计的类,它们特定于控制器并查看特定数据,并允许更轻松地在域模型和控制器之间进行迭代.例如,在域(模型)中设计用户实体时

public class User
{
    public string UserName { get; set; }
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在为您的应用程序设计登录控制器时 - UserViewModel

public class UserViewModel
{
    public string UserName { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
    public string LoginHelpText { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这不是现实生活中的例子,但在设计视图模型和设计领域模型时,您应该看到主要区别.如您所见,ViewModel是模式控制器和特定于操作的,并且包含用于更好的表示和用户迭代的数据,而域模型被设计为在域内工作而不关心表示 - 域模型不需要第二个ConfirmPassword字段例如.为了更好地将ViewModels与域模型一起使用,您可以查看AutoMapper和其他社区工具.

ViewModels不应包含数据库的数据访问逻辑,也不应包含业务逻辑.在这种情况下,Models也不应包含对数据库的访问权限.为此,您应该创建存储库.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读steven sanderson的书籍pro asp.net mvc 3了解详情