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

Hon*_*ode 12 asp.net asp.net-mvc entity-framework c#-4.0 asp.net-mvc-3

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

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

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

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

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

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

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

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

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

//型号1

public class Person
{
  int PersonID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}
  DateTime DOB {get;set}
}
Run Code Online (Sandbox Code Playgroud)

//模型2

public class Place
{
  int PlaceID {get;set;}
  string Description {get;set;}
  string AreaType {get;set;}
  string PostCode {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

// 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}
}
Run Code Online (Sandbox Code Playgroud)

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

public interface IPerson
{
  string FirstName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

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

public interface IPlace
{
  string Description {get;set;}
  string AreaType {get;set}
}
Run Code Online (Sandbox Code Playgroud)

// ViewModelController?

{
  //What goes here?
}
Run Code Online (Sandbox Code Playgroud)

//库?

{
  //what goes here?
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ter 6

我想你可能有一个非常简单的概念.

首先是一些一般规则:

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

您不必使用接口.

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

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

最后,在这里查看我的回复TryUpdateModel,ASP .NET MVC 3的真实示例