Asp.net mvc 3 具有ViewModel CRUD页面的ASP.NET MVC3实体

Asp.net mvc 3 具有ViewModel CRUD页面的ASP.NET MVC3实体,asp.net-mvc-3,automapper,Asp.net Mvc 3,Automapper,我将EF与ViewModel和AutoMapper设计策略一起用于MVC3应用程序 我想知道是否有比我现在做的更有效的方法来创建CRUD页面 我目前的程序包括: 创建实体 通过复制粘贴创建ViewModel,然后删除非必填字段 将实体添加到上下文列表中 通过Visual Studio 2010创建控制器向导页面创建控制器 我使用实体框架选择了一个带有读写操作和视图的控制器模板 我选择我的模型作为我的ViewModel,而不是实体 我选择适当的上下文 现在我认为第一部分可以改进,我必须重新编写所

我将EF与ViewModel和AutoMapper设计策略一起用于MVC3应用程序

我想知道是否有比我现在做的更有效的方法来创建CRUD页面

我目前的程序包括:

  • 创建实体
  • 通过复制粘贴创建ViewModel,然后删除非必填字段
  • 将实体添加到上下文列表中
  • 通过Visual Studio 2010创建控制器向导页面创建控制器
  • 我使用实体框架选择了一个带有读写操作和视图的控制器模板
  • 我选择我的模型作为我的ViewModel,而不是实体
  • 我选择适当的上下文
  • 现在我认为第一部分可以改进,我必须重新编写所有CRUD方法,以使用AutoMapper和Entity/ViewModel设计模式更改:
返回视图(db.BlockedUserViewModels.ToList())

进入:

IList blockedUsers=db.blockedUsers.ToList();
IList blockedUsers=AutoMapper.Mapper.Map(blockedUsers);
返回视图(BlockedUserMS);
  • 我必须向每个控制器CRUD选项添加相同的[Authorize]和角色权限

这似乎在工作量上有点过头了!我希望有更好的解决办法。(我来自Python/Django,它需要一行代码来创建漂亮的强CRUD页面)

这真的取决于这对您来说有多痛苦,但您始终可以使用在Nuget中找到的、由Steven Sanderson编写的MVC脚手架。从长远来看,投入一些时间可以帮助你,但你必须弄清楚这是否适合你


听起来您可以添加服务并将其注入控制器。那你只需要打电话

var model = _service.GetBlockedUsers();
每次,而不是:

IList<BlockedUser> blockedUsers = db.BlockedUsers.ToList();
IList<BlockedUserViewModel> blockedUserVMs = AutoMapper.Mapper.Map<IList<BlockedUser>, IList<BlockedUserViewModel>>(blockedUsers);
IList blockedUsers=db.blockedUsers.ToList();
IList blockedUsers=AutoMapper.Mapper.Map(blockedUsers);
这将使你的控制器轻,并作为一个地方,以保持你的积垢逻辑,所以你不必重复它无处不在


此外,如果
[Authorize]
属性适用于控制器中的每个操作,则可以将其添加到控制器中。

我之前已经简要介绍了这一点,它似乎确实能够完成我所寻找的任务,但我需要从头开始编写scaffolder。一定有人在那里谁做了与AutoMapper脚手架的工作,并提供那里的代码!可能会有,但编写自己的代码会使处理代码与其他代码之间的差异变得更容易。好的一点是,我忽略了一个简单的解决方案,即寻找一个包来为我提供此功能。将这些实用程序方法放在上下文中是否合适?感谢您提供有关控制器[Authorize]属性的提示,遗憾的是它们不一致。这取决于您的实现。我对实体使用存储库模式,以便它们管理CRUD操作,而我的服务只是我存储库的包装器,将实体映射到它们关联的视图模型。知道您描述的教程/示例吗?我已经读过关于存储库特性的介绍,但还没有完全理解添加的复杂性层的好处。我使用我自己对讨论的存储库模式稍加修改的实现。在EF4.1中引入repository模式的唯一真正原因是使DAL可用于单元测试。除此之外,这基本上只是额外的开销。这不是我所希望的解决方案,但这是帮助我更快前进的最佳答案,谢谢。
IList<BlockedUser> blockedUsers = db.BlockedUsers.ToList();
IList<BlockedUserViewModel> blockedUserVMs = AutoMapper.Mapper.Map<IList<BlockedUser>, IList<BlockedUserViewModel>>(blockedUsers);