视图应该如何“分离”?
问题描述:
我知道一个视图应该只显示内容,除了显示信息所需的内容外本身不执行任何逻辑。视图应该如何“分离”?
什么是最好的方式,在保持这一点,来处理这种简单的情景:
- 用户点击删除项目
- 如果该项目仍与其他系统有关,显示“你可以不要删除这个。“
- 否则,显示一个确认形式的职位,以行动/删除/编号
我可以在视图中非常容易地做一些事情,如:
@if (Model.Children.Count > 0)
{
<p>
You can't delete this!
</p>
}
else
{
using (Html.BeginForm())
{
<p>
Are you really sure you want to delete this?
</p>
<p>
<input type="submit" value="Confirm" /> |
@Html.ActionLink("Cancel", "Index")
</p>
}
}
是否有令人信服的理由提出两点意见并根据有多少孩子,让控制器返回适当的视图?看起来像是简单和关注点分离的折衷。
答
这是一个非常简单的例子,所以乍一看似乎无害的(如果它保持这样它肯定是)。但是,请记住这些因素:
- 如果它变得不仅仅是儿童?也许还有其他三种关系随着时间的推移出现,现在你需要检查你的观点中的所有关系吗?突然代码味道更强。
- 把这种类型的逻辑控制器可以让其他的方法的问题更明显或易后,例如,增加一个Ajax版本,可以让你带来的“你不能删除这个”回馈用户无需离开以前页。
答
我会分离那些在2个不同的视图,并具有控制器动作挑基于视图模型值(Children.Count在这种情况下)正确的视图。但这是说另一种方法也没有错。它适用于像这样的简单场景。
答
对于这种场景,通常你会有一个Model属性,它实际上是你是否可以删除它的标志(这更符合ViewModel方法),以便视图不是实际上是在做逻辑,控制器只是告诉视图什么动作可用。
@if(Model.CanDelete) {
using (Html.BeginForm())
{
<p>
Are you really sure you want to delete this?
</p>
<p>
<input type="submit" value="Confirm" /> |
@Html.ActionLink("Cancel", "Index")
</p>
}
} else {
<p>You can't delete this!</p>
}
CanDelete可以使用儿童数据状态,角色成员资格,经营状况等,但到视图的组合控制器来填充所有这些东西不应该的问题
我将使用两个视图,它总是更好地让你的观点尽可能简单。 –