【问题标题】:ASP.NET MVC 2 Using an interface to strongly type a partialASP.NET MVC 2 使用接口强类型化部分
【发布时间】:2011-03-23 09:33:23
【问题描述】:

我正在试验 ASP.NET MVC2,尤其是视图模型和局部视图。我的问题是:如果视图使用局部,让你的局部强类型化接口并且让你的视图模型实现该接口是“有效的”还是“正确的”?

为了说明,假设我有一个 Product 表单部分(针对 IProductFormViewModel 进行强类型化),它在 Edit 和 Create 视图中都使用。这些视图是针对实现 IProductFormViewModel 的 ProductEditViewModel 和 ProductCreateViewModel 进行强类型化的。

好处是 Create 和 Edit 的相应 POST 操作分别采用 ProductCreateViewModel 和 ProductEditViewModel 对象。


编辑: 如果部分有自己的专用视图模型 (ProductFormViewModel) 并且每个 ProductEditViewModel 和 ProductCreateViewModel 都公开一个传递给部分的 ProductFormViewModel 类型的属性,那么当提交表单时,ProductEditViewModel 和 ProductCreateViewModel 的模型绑定不起作用编辑和创建操作需要各自的对象类型……这就是采用这种方法的原因。

【问题讨论】:

    标签: asp.net asp.net-mvc-2 viewmodel partials


    【解决方案1】:

    当您的不同部分的接口公开相同的属性名称时,您可能会遇到问题,例如姓名。然后你必须显式地实现接口,这会导致你的模型绑定出现问题。

    否则它应该可以工作。

    【讨论】:

      【解决方案2】:

      是的,这似乎是一种有效的方法。

      【讨论】:

        【解决方案3】:

        接口本质上是需要通过实现类来实现的契约。但在视图引擎的情况下,我看不到让视图模型实现接口的任何具体好处,因为最后你必须在控制器中实例化视图模型并将其传递给视图,并假设你更改 ProductFormViewModel 或 EditProductViewModel 的实现,你仍然必须在控制器中实例化(填充)对象并将其传递给视图。所以它并没有达到我们在存储库模式中结合依赖注入所做的相同目的。如果您能说出您想通过这种方法实现的具体目标,我们可能会有所帮助。

        【讨论】:

          【解决方案4】:

          你的方法很好。

          或者你可以有一个特定于你的局部模型并使用组合来代替,例如:

          public class AddressModel
          {
              public string Address { get; set; }
              public string Code { get; set; }
          }
          
          public class PersonModel
          {
              public string Name { get; set; }
              public AddressModel Address { get; set; }
          }
          

          然后在重新渲染您的局部时,您将其传递给正确的模型。

          HTH

          【讨论】:

          • 好的,但是当我提交部分内容以更新数据并返回需要 PersonEditViewModel 并获得 AddressModel 的 Edit 操作时会发生什么?如何将 AddressModel 绑定到 PersonModel.AddressModel?
          • @Rob,您的设计可能有所不同,但我将部分视为不控制“顶级”任务的可组合位。他们可以与服务器交谈,但要执行“本地”(部分级别)任务。所以部分不应该控制提交;在这种情况下,Person 应该控制提交(并且地址数据随之而来)。我必须承认我没有使用 MVC 提供的模型绑定,所以我希望这个评论是有意义的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          相关资源
          最近更新 更多