绘制逻辑中的 ViewModel 或 View 职责

ViewModel or View responsibility in draw logic

昨天我和我的一位工作伙伴就 ViewModel 和 View 职责进行了一些讨论。我有一个文本会在不同的上下文中发生变化,例如视图中的 Edit/New 模式。其中一位团队程序员写了这样的东西:

@if (Model.IsNew)
{
    @Resources.New;
}
else
{
    @(Resources.Editing + " " + Model.Name);
}

我捍卫这个逻辑是 ViewModel 的责任:

在视图模型中:

public string PageTitle => IsNew ? Resources.New : $"{Resources.Editing} {Name}";

然后在视图中:

<h2>
    @Model.PageTitle
</h2>

但我的同事捍卫谁是打印逻辑,所以 View 有责任。

我们都有自己的论点,但我想知道社区的意见。

我想说这段逻辑与视图更相关 - 因为我们正在谈论页面 标题

但是我没有创建嵌套语句,而是为此创建了一个 Html 帮助程序 f.i。 Html.PageTitle(Model).

如果你查看MVC模式的定义,你可以看到:

A view generates new output to the user based on changes in the model.

的意思是,如果要妥善遵守Separation of Concerns原则,视图负责显示UI中的数据,模型代表属性包您将查看的数据。

所以基本上你的视图的底层模型就是你的视图模型,通过这个我会把这个 属性 放入视图模型和将它设置为 controller/viewmodel builder/service/whatever 的逻辑符合您的需求。

为了进一步证明这一点,请问您的同事 unit/integaration 在视图中测试代码有多容易?带来一个新的测试只是为了断言这个逻辑的结果?没有给我带来真正的商业价值...

要进一步扩展此主题以将关注点分开,您可以:

  • 为新模式、编辑模式等创建非常精简且集中的控制器
  • 根据这些模式分离视图模型,因此您的视图模型与视图处于 1-1 关系。

虽然这些都是自以为是,但一定要创造一个适合每个人的环境。

其ViewModel代码,完全同意Kayess。视图不必弄清楚它们显示的内容。

在整个视图中看到 @{ } 让我脊背发凉。它总是有错误、无法测试的代码。