【问题标题】:What to put in your ViewModel在 ViewModel 中放入什么
【发布时间】:2010-10-06 07:31:17
【问题描述】:

你在你的视图中放了什么?

最近来自Scott Hanselmanblog 关于使用特殊模型绑定器以简化测试,这让我想到了以下几点: 您在构建视图模型的控制器逻辑中放置了什么,应该在视图中放置什么?他的工作是这样的:

var viewModel = new DinnerFormViewModel {  
    Dinner = dinner,  
    Countries = new SelectList(PhoneValidator.Countries, dinner.Country)  
};  
return View(viewModel);

现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理 Country 属性。你可以争论双方: 在 SelectList 中包装国家列表可以为视图准备数据,就像您创建视图模型 DTO 来传递数据一样。 另一方面,不知何故,感觉就像您在专门操纵要在下拉列表中使用的数据,从而限制了视图处理来自控制器的数据的方式。 我觉得这在视图和控制器之间的关注点分离上有点灰色地带,我真的无法决定走哪条路。有没有这方面的最佳做法?

PS:为简单起见,我们假设默认的 ASP.NET MVC 上下文,所以基本上是您的开箱即用项目。默认视图引擎和所有爵士乐。

【问题讨论】:

    标签: asp.net-mvc separation-of-concerns


    【解决方案1】:

    在 MVC 中(至少是这种风格),控制器的职责之一是为视图准备数据。所以我认为为视图消费准备一个特定的模型是完全可以接受的,这意味着它将在下拉列表中使用。在这种情况下,控制器只是让视图更容易,实际上可以防止笨拙的代码不得不流入视图。它还可以防止在 ViewData 中出现像 VieData["Countries"] 这样的魔法字符串。

    总而言之,虽然在职责方面似乎存在一些灰色区域,但最终这就是控制器的工作:与视图交互并将域模型转换为其他更容易处理的模型被视图消费。

    【讨论】:

    • 是的,我认为你是对的。如果视图中需要国家列表的另一种表示形式,您基本上会为此创建另一个视图 DTO,对吗?
    • 可能。尽管也许 SelectList 可以由不同的 UI 构造表示,例如复选框列表或其他东西。也许不同的 html 辅助方法仍然可以使用 SelectList 并输出其他内容。
    • +1 以这种方式使用视图模型会从视图中移除更多逻辑,这始终是可取的。
    【解决方案2】:

    有些人认为每个视图都有一个包罗万象的视图模型是理想的(称为Thunderdome Principle)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      相关资源
      最近更新 更多