MVC的最佳实践..使用接口的ViewModel绑定示例

时间:2011-10-27 10:19:50

标签: asp.net asp.net-mvc asp.net-mvc-3 entity-framework c#-4.0

我是ASP.NET MVC 3.0的新手,并尝试使用MVC ViewModel设计构建应用程序。

我想知道为ViewModel重新调整控制器的最佳做法是什么,并在下面提出几个问题。这是我目前的理解(可能是错误的)..

  • 我们创建模型。
  • 通过创建一个新类并使用与基本模型类相同的名称和类型声明属性来创建ViewModel(包括您稍后要更新的基本模型的ID字段......并且这些类不以任何方式链接)。
  • 为每个基本模型创建一个存储库(以查找和保存数据等)。
  • 为每个ViewModel创建一个Controller操作(访问基类的存储库以检索值并将这些值放入ViewModel,然后将ViewModel传递给ViewModels视图)。
  • 从ViewModel创建视图(ViewModel Views)
  • 在ViewModel控制器中,Update(POST)方法接收更新的ViewModel对象并将其转换为基本模型对象(也许使用Automapper?),接下来使用它们的存储库保存基础模型对象并应用这样的绑定? “TryUpdate<'IPerson>(person)”,“TryUpdate<'IPlace>(地点);” (这看起来不对,目的是将值从ViewModel放回到基类中,应用绑定,使用存储库保存基本模型!这似乎不使用存储库..而不是TryUpdate<'IPerson> (人);我希望看到这样的东西:person.Save(IPerson)..其中“人包含值”,“。存储是存储库”,“IPerson包含用于绑定的绑定属性”? ..不确定这是不是..

到目前为止,我已经通过创建一个新类并使用相同的名称从不同的基本模型添加属性来创建ViewModel。此时我有以下问题:

Q1:每个ViewModel是否都有自己的控制器并访问每个基本模型存储库类以获取其值?

Q2:在ViewModel中,您应该包含您使用属性的所有基本模型的ID字段,考虑到您可能希望通过ViewModels Controller将Update更新回基础模型库(需要ID)值)?

问题3:如何使用接口绑定属性,以使用存储库来保存控制器中的模型。

我无法找到一步一步解释所有内容的教程或资源,完整的答案将是以下示例:

  • 2x简单模型,1x简单viewModel,1x接口用于绑定,1x简单控制器使用接口类进行绑定更新,1x存储库..即

//型号1

public class Person
{
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}
  DateTime DOB {get;set}
}

// Model2的

public class Place
{
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}
  string PostCode {get;set;}
}

// ViewModel(包含模型中的属性)

publc class ViewModel
{
  //Person attributes
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}

  //Place attributes
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}

  //other attributes
  string someOtherAttributeForDisplay {get;set}
}

// Model1接口(用于绑定模型)

public interface IPerson
{
  string FirstName {get;set;}
}

// Model2接口(用于绑定模型)

public interface IPlace
{
  string Description {get;set;}
  string AreaType {get;set}
}

// ViewModelController?

{
  //What goes here?
}

//存储库?

{
  //what goes here?
}

1 个答案:

答案 0 :(得分:6)

我认为你可能过于复杂化了一个非常简单的概念。

首先是一些一般规则:

  • 请勿使用TryUpdateModel。只是不要。
  • 出于同样的原因,请勿使用任何“自动”映射映射器将您的视图模型映射到您的实体。反过来自动映射(从实体到视图模型)很好。

您不必使用接口。

视图模型应该是非常简单的类,它们只包含视图所需的信息。如果您的视图从显示的内容中发布不同的信息,则只需为POST创建不同的视图模型。

我们为视图模型使用{Controller} {Action} Model的命名约定。因此,对于“Post”控制器上名为“List”的动作,我们将有一个名为“PostListModel”的模型。

最后,请在此处查看我的回复Real example of TryUpdateModel, ASP .NET MVC 3