昨天我和我的一个合作伙伴就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有责任。
我们俩都有自己的观点,但我想了解社区意见。
答案 0 :(得分:2)
如果你查看MVC模式的定义,你可以看到:
视图根据模型中的更改为用户生成新输出。
意味着如果您想要正确遵守Separation of Concerns原则,视图负责在UI中显示数据,模型代表您将要查看的数据属性包。
所以基本上你的视图的底层模型是你的viewmodel,通过这个我将把这个属性放入viewmodel以及将它设置为controller / viewmodel builder / service /的任何符合你需要的逻辑。
为了进一步捍卫这一点,请问你的同事在视图中对代码进行单元/整合测试有多容易?引入一个新的测试只是为了断言这个逻辑的结果?给我带来真正的商业价值......
为了进一步扩展此主题以保持关注点,您可以:
尽管所有这些都是固执己见,但请务必创建一个适合所有人的环境。
答案 1 :(得分:1)
我会说这段逻辑与视图更相关 - 因为我们正在谈论页面标题。
但是我没有创建嵌套语句,而是为此创建了一个Html帮助器,f.i。 Html.PageTitle(Model)
。
答案 2 :(得分:1)
它的ViewModel代码,完全赞同Kayess。视图不应该弄清楚它们显示的内容。
在整个视图中看到@ {}会让我的脊椎发抖。它始终是错误的,不可测试的代码。