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用作视图的模板是否正确?有没有人知道互联网上的一个好例子?
非常感谢!
不仅有意义,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了解详情
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |