经过多年的ASP.NET表单开发之后,我终于搞定了MVC(版本3)。我在N层应用程序架构的强大背景,我试图接近这个新项目得当,用一个清晰的关注分离等MVC 3 + EF 4.1 + POCOs + ViewModel模式+带脚手架的控制器==混乱!
我所做的是先有自己的代码,首先由创造我的POCO。从这个框架创建我的数据库。
然后,我通过把我所有的EF查询和CRUD方法库中存储的类为每个我的POCO类的在我的模型组装实施Repository模式。这样,我的控制器就不需要知道如何通过EF访问我的数据。大。
最后,我在模型组件创建了几个视图模型类。我的意图是,对于某些操作(如创建和编辑),我从RAZOR视图引用ViewModel类,而不是我的POCO类。这样,我可以让我的POCO类以及SelectList在我的ViewModel中填充下拉菜单。两者都是通过引用相关的存储库类来填充的,这些类是从我的控制器操作中调用的。我觉得我在一个卷现在:
class MyObject
{
public int ID {get;set}
[Required]
[StringLength(512)]
public string Name {get;set;}
}
class MyViewModel // ViewModel for a specific view
{
public MyObject MyModel {get;set;} // the model that is being edited
// other data the view might need, set by the controller
public string SomeMessage { get; set; }
public List<SomeObject> SomeObjects {get;set;} /// e.g. for a drop-down list
// My constructor below that populates the "SomeObjects" list, and accepts the
// "MyObject" class as a parameter in order to set the "MyModel" property above...
// ..........
}
问题... ...
之前,我开始使用从我的控制我的ViewModel类创建和编辑的操作,我在POCO类直接传递。一切正常,当我打的保存按钮从我的编辑形式,我的观点中:
旧代码:
[HttpPost]
public ActionResult Edit(MyObject mine)
{
if (ModelState.IsValid)
{
myRepository.Update(mine);
myRepository.SaveChanges();
return RedirectToAction("Index");
}
return View(mine);
}
当我打救,我的POCO类(为MyObject)将返回,自动的填充从形式中获得价值,它会成功拯救,而生活则是桃色。
当我切换到传递我的视图模型(MyViewModel),一切都土崩瓦解。
我能够通过设置在我的编辑视图顶部的@model参考参考我的视图模型(MyViewModel)。然后,我可以从我的POCO类(MyObject)中填充表单字段,该类是ViewModel的一部分。我甚至可以从ViewModel中的SomeObjects集合填充DropDownList,并从我正在编辑的MyObject类中预先选择正确的一个。一切似乎罚款UNTIL ...
当我打的保存按钮和我的控制器的编辑的ActionResult(POST行为)被调用,就是在传递给的ActionResult在为MyObject类(公共的ActionResult编辑(为MyObject矿))为空。然后,我尝试将传入的对象更改为ViewModel(public ActionResult Edit(MyViewModel myVM)),该引用将MyObject类(MyModel)引用为null。
我缺少什么?
我知道它必须是非常简单的东西,它将我凝视在脸上,我看不见它!
很好,你解决了你的问题!将答案设置为解决方案,以便其他人可以看到问题得到解答。 – Wim 2011-05-23 12:31:39