Asp.net mvc asp.net mvc强类型帮助程序-渲染绑定对象是否应与发布对象相同?

Asp.net mvc asp.net mvc强类型帮助程序-渲染绑定对象是否应与发布对象相同?,asp.net-mvc,data-binding,Asp.net Mvc,Data Binding,我看到asp.net mvc 2提供了强类型帮助,并初步了解了它的工作方式。我认为,在asp.net mvc 1中,在呈现视图和发回控制器的数据绑定方面,我可能做错了什么 我经常有不同的对象来渲染视图和发回控制器。这是错的吗??渲染视图时,通常会有一个viewmodel,其中包含下拉列表等,这似乎很自然。但对于发布,您只需要返回所需的属性 例如,在进行渲染的过程中,我的viewmodel可能如下所示 public class PersonViewModel { public in

我看到asp.net mvc 2提供了强类型帮助,并初步了解了它的工作方式。我认为,在asp.net mvc 1中,在呈现视图和发回控制器的数据绑定方面,我可能做错了什么

我经常有不同的对象来渲染视图和发回控制器。这是错的吗??渲染视图时,通常会有一个viewmodel,其中包含下拉列表等,这似乎很自然。但对于发布,您只需要返回所需的属性

例如,在进行渲染的过程中,我的viewmodel可能如下所示

 public class PersonViewModel
 {
      public int Age;
      public string FIrst;
      public JobCategory[] JobCategories;
      public Sport[] Sports;
      public int NumberOfChildren;

 }
在本例中,jobCategoriesSports将用于填充下拉框NumberOfchildren将只是html,我不希望它可编辑。当我想发布时,我只想传回一个只有发布属性的细长对象,这样我就有了另一个对象

  public class PersonUpdater
 {
      public int Age;
      public string FIrst;
      public int JobCategoryId;
 }
这些是我需要传回的唯一属性,因此我的控制器将如下所示:

 public ActionResult Update(PersonUpdater personUpdater)
 {
      _repository.UpdateModel(personUpdater). 
 }
因此,考虑到上述情况,假设强类型助手方法(如下)似乎对导入有用,但如果您引用不同的属性,则可能会导致发回服务器时出现问题


有什么想法吗?

您可以指定在强类型帮助器中引用的属性,使用3个参数查找重载

你的方法没有问题。
强类型视图可以帮助您更好地开发,因此没有typpo可以妨碍您。

大多数情况下,自动绑定的内容不符合我的需要,因此我只需将其发布到
formCollection
参数并手动执行即可。如果您可以使用模型绑定魔法的任何部分,那么对您来说一切都会更好


绑定更少并不意味着回发到服务器的数据更少。表单中的所有输入元素都将被传输,您不会将它们视为离散的、强类型的“automagic”参数。如果您真的想精简post数据,则必须限制post特定表单中的输入元素。MVC毕竟仍然是HTTP…

真正的问题是-当前接受的方法忽略了视图模型的一个位编辑表单同时充当输入和输出

人们还没有接受将
视图模型
划分为我所称的
输入视图模型
输出视图模型
(对于许多人来说,甚至创建
视图模型
层也太多了)。因此-Mvc2目前缺乏对此的支持(您不应该拥有不同时输入和输出的强类型视图),主要原因是模糊性和缺乏广泛接受的方法

但我确实认为,深入研究并将
视图模型
分为两部分是有好处的(好吧……这实际上是一种权衡)。如果这个想法能够发展并最终被广泛接受,我也不会感到惊讶

实际上,当前的方法甚至有一个名称-。如果像杰里米·D·米勒这样的人说这是正确的,社区就不会麻烦,也不会搜索其他任何东西



从实际的角度来看,一些问题可以通过提供正确的元数据(您可能想签出)来缓解。

我建议只使用一个对象来获取和发布,以保持简单。代码可维护性在这里比为更新操作节省几个字节更重要/更有价值

Arnis就SRP和其他设计模式提出了很好的论据,但Pettern应该被改编。如果我是你,我会使用mvc框架为你创建的帮助:使用类型化的帮助程序;对GET/POST使用类型化的model/viewmodel对象,如果需要更复杂的绑定,请创建自定义绑定器


让你的代码保持轻松,你的应用程序就会非常棒。

我使用一个模型作为输入(由表单显示),使用一个单独的模型作为输出(由表单发布)。验证放在输出模型上。我这样做的具体原因是为了下拉列表。您希望向用户显示一个可能值的列表,这些值位于输入模型中。在表单的输出或post中,我不想要可能值的列表,我想知道用户选择了哪些值(如果有的话)。

我对输入[GET]和输出[post]也使用单独的视图模型,除非这两个模型相同。IMHO此方法更干净、更易于维护,并且更清楚地表示给定控制器操作将更新哪些数据

LOC是有成本的,但额外的代码通常不符合逻辑。在大多数情况下,我不认为在两个对象上复制一些自动属性违反了DRY原则,我认为遵循SRP的成本是合理的


正如您所注意到的,另一个代价是内置的强类型助手工作得不太好。您是否考虑过编写自己的助手来支持您的模式?例如,您可能会重载一个现有的帮助程序,这样您就可以指定源(例如输入模型的属性)和目标(例如发布到输出模型的表单字段的名称)。

只要看看您的具体情况,我就会想到以下几点

1) 这两种模式确实非常相似 2) 如果添加“MiddleName”,则必须在两个位置添加它 3) 当您说“我只想传回一个细长对象”时,无论您绑定到原始模型还是新模型,实际的POST都将包含相同数量的数据(它将为表单中的每个用户输入包含一个键、值对) 4) 您排除了在“保存的确定”或“某些内容无效”页面上显示数据的选项,因为它不是模型的一部分

出于这些原因,我建议对操作的GET和POST使用相同的模型。

但是t的属性是什么