2011-05-20 55 views
2

经过多年的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。

我缺少什么?

我知道它必须是非常简单的东西,它将我凝视在脸上,我看不见它!

回答

1

Wim,

非常感谢您的帮助。我确实有无参数的构造函数,我刚从示例中省略了它。

我实际上是在追查这个问题。平心而论,我输入的代码并不是真正的代码,因为当我发布这些代码时,我并没有将它放在前面。什么问题是是,在我的视图模型我的实体模型类的引用其实是有它的set访问私有:

public MyObject MyModel {get;private set;} 

这妨碍了ModelBinder的填充从控制器的保存方法在回发时该属性。

我现在要做的是将我的验证逻辑从我的EF POCO移到我的ViewModel,这似乎是这种模式中推荐的操作。

感谢您的时间,我希望这可以帮助那些对这个框架不熟悉的类似问题的其他人。

+0

很好,你解决了你的问题!将答案设置为解决方案,以便其他人可以看到问题得到解答。 – Wim 2011-05-23 12:31:39

2

看看FormCollection,键的名字应该与你想填充的类的属性相匹配。这是MVC的默认模型绑定的工作原理。

+0

事情是,我没有改变FormCollection中键的名字。当我最初在视图的@model声明中引用我的POCO类时,它正在工作。当我将@model声明更改为我的ViewModel类时,就是当一切停止工作时。我知道我在这里错过了一些简单的东西。 – 2011-05-20 11:30:08

+0

我刚刚看到关于MyViewModel构造函数的注释。 modelbinder需要一个不带参数的构造函数。 – Wim 2011-05-20 14:51:11