现在我偶然发现了一个问题,我似乎无法得到一个直接的答案 – 从所有的博客 – 而且我想从社区获得一些洞察力.这是关于编辑(阅读:编辑操作).大量的材料,教程和博客,处理创建和查看模型.所以虽然这个问题可能并不是一个问题,但我希望能够进行一些讨论,有助于我决定我要采取的发展道路.
我的模型代表具有几个字段(如姓名,地址和电子邮件)的用户.所有的名字,其实在字段上每个都有名字,姓氏和中间名. “详细信息”视图显示所有这些字段,但您一次只能更改一组字段,例如您的名称.用户展开表单,而其他字段在上下仍然可见.因此,回发的表单包含表示模型的字段的一个子集.
虽然这对我们和布局的关注感兴趣,但由于各种原因,这将被严重的MVC开发人员所忽视.我一直在阅读一些模式和最佳实践,似乎这与viewmodel == view的范例并不重要.还是我错了?
无论如何,NerdDinner规定使用FormCollection och UpdateModel.所有的空字段都被高兴地忽略.从那时起,MVC社区已经放弃了这种方式,使得没有发现MVC 2中的bug.如果您的formcollection中没有完整的模型,UpdateModel将无法正常工作.
view model pattern获得最多的赞誉似乎是专用视图模型,其中包含一个自定义视图模型实体,是唯一一个可以与我的设计问题兼容的视图模型实体.尽管使用了AutoMapper和Jimmy Bogard的ideas,这可能或可能不值得,但它需要繁琐的测绘数据.他还提出了观点和观点模式之间的1:1关系.
为了符合这些设计范例,我将为每个扩展的字段创建一个视图和关联视图.视图模型各自几乎相同,仅在只读的字段中不同,视图也包含很多重复的标记.这对我来说似乎是荒唐的.将来我可能希望能够同时显示两个或多个字段.
我最会仔细阅读我希望引发的讨论.提前谢谢了.
解决方法
我有一个示例asp.net-mvc应用程序,我在mvc中演示了最佳做法,您可以在@L_404_5@
public ActionResult Edit(long id) { return View(modelBuilder.BuildModel(personService.Get(id))); } [HttpPost] public ActionResult Edit(Personviewmodel model) { if (!ModelState.IsValid) return View(modelBuilder.RebuildModel(model)); personService.Save(modelBuilder.BuildEntity(model)); return RedirectToAction("Index"); }
ValueInjecter的快速演示:
//build viewmodel personviewmodel.InjectFrom(person) .InjectFrom<CountryToLookup>(person); //build entity person.InjectFrom(personviewmodel) .InjectFrom<LookupToCountry>(personviewmodel);