为ViewModels选择什么方法

本文关键字:方法 什么 选择 ViewModels | 更新日期: 2023-09-27 18:11:52

我使用ViewModels与asp.net mvc。我很好奇的一件事是,假设我有一个名为Customers的实体它有添加,编辑,删除屏幕。假设它们都有不同的属性需求。

例如

添加可以有地址字段,但编辑界面可以没有编辑界面,删除可以只使用客户名而不是其他任何内容。

我的问题是,你如何为此创建ViewModels ?您是否使用添加,编辑和删除之间共享视图模型的方法,即单个视图模型类为您处理所有内容,或者您更喜欢创建视图模型类/页面?

共享视图模型的优点是它减少了开发时间,我们可以重用类。但这样做的一个大问题是,如果你使用Automapper这样的工具,你可能会期望不同屏幕的结果。

一个视图模型/页面的缺点是它增加了开发时间。我该走哪条路?

为ViewModels选择什么方法

我的视图模型方法是使用共享视图模型,直到对视图的需求(传输的数据)不同为止。这意味着我使用共享视图模型,例如CreateAddress和EditAddress,以防传输到视图的所有数据都是相同的。如果需要在视图中显示额外的字段,例如在CreateAddress视图中,我正在重构我的视图模型,并为CreateAddress和EditAddress使用不同的视图模型。

例如,对于DeleteAddress,我将从一开始就使用不同的视图模型,因为我知道DeleteAddress视图中显示的数据几乎永远不会与Create/EditAddress相同。

另一种方法是使用动态视图模型,因为视图模型不应该/一定不能实现业务逻辑,而是充当控制器和视图之间的dto,这种方法有一些好处(不需要创建逻辑自由,扔掉dto)。

视情况而定。如果你对不同的屏幕有类似的需求(验证、呈现属性等),你可以跨不同的视图使用视图模型。如果有一个或两个属性的差异,我仍然会使用相同的视图模型,在不需要这些属性的地方,我将把它们放在隐藏的输入中,这样它们就会随着表单post返回,不允许不需要的结果。众所周知,隐藏字段是可以调整的,由开发者决定使用隐藏字段是否安全。但是,如果我对两个屏幕有不同的验证要求,那么我肯定必须使用视图模型/页面方法。您可以根据需求混合使用这两种方法,正如他们所说的"没有最好的做事方法"

模型中存在的所有字段都可以更改。它们是否隐藏并不重要。用户所要做的就是检查你的页面,并试图找出模型中存在哪些字段。

然后他可以添加这些字段(例如使用Chrome Dev Tools)来对它们进行更改。

摆脱这个问题的最安全的方法是只拥有允许更改的字段的模型。

也就是说,如果模型中的所有字段都应该允许所有用户更改,那么继续使用相同的模型。(并且不显示不应该修改的字段)