绘制逻辑中的ViewModel或View责任

时间:2016-12-13 12:42:34

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

昨天我和我的一个合作伙伴就ViewModel和View责任进行了一些讨论。我有一个在不同上下文中更改的文本,例如视图中的编辑/新模式。其中一位团队程序员写了这样的东西:

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

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

在ViewModel中:

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

然后在视图中:

<h2>
    @Model.PageTitle
</h2>

但我的同事捍卫那是一个印刷逻辑,所以View有责任。

我们俩都有自己的观点,但我想了解社区意见。

3 个答案:

答案 0 :(得分:2)

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

  

视图根据模型中的更改为用户生成新输出。

意味着如果您想要正确遵守Separation of Concerns原则,视图负责在UI中显示数据,模型代表您将要查看的数据属性包。

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

为了进一步捍卫这一点,请问你的同事在视图中对代码进行单元/整合测试有多容易?引入一个新的测试只是为了断言这个逻辑的结果?给我带来真正的商业价值......

为了进一步扩展此主题以保持关注点,您可以:

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

尽管所有这些都是固执己见,但请务必创建一个适合所有人的环境。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

它的ViewModel代码,完全赞同Kayess。视图不应该弄清楚它们显示的内容。

在整个视图中看到@ {}会让我的脊椎发抖。它始终是错误的,不可测试的代码。