应该如何“分离”?

时间:2011-10-28 16:33:42

标签: asp.net-mvc-3

我理解一个视图应该只显示内容,并且在显示信息所需的范围之外不做任何逻辑。

在记住这一点时,最好的方法是处理这种简单的场景:

  1. 用户点击删除项目
  2. 如果该项目仍与其他人相关联,请显示“您无法删除此内容。”
  3. 否则,请显示发布到操作/删除/ ID
  4. 的确认表单

    我可以很容易地在视图中执行以下操作:

    @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>
      }
    }
    

    是否有令人信服的理由制作TWO视图并让控制器返回适当的视图,具体取决于有多少孩子?似乎是对简单性和关注点分离的权衡。

3 个答案:

答案 0 :(得分:4)

这是一个非常简单的例子,所以乍一看它似乎无害(如果它保持这种方式肯定是)。但是,请牢记这些因素:

  • 如果它变得不仅仅是孩子,该怎么办?也许随着时间推移会出现其他三种关系,现在您需要在视图中检查所有这些关系吗?突然间,代码味道更强了。
  • 将这种类型的逻辑放在控制器中可能会使问题的其他方法在以后变得更加明显或容易,例如,添加一个ajax版本,让您在不离开之前的情况下为用户提供“您无法删除此”的反馈页。

答案 1 :(得分:3)

我会将2个不同视图中的视图分开并让控制器操作根据视图模型值(在本例中为Children.Count)选择正确的视图。但是,据说其他方法也没有错。它适用于这样的简单场景。

答案 2 :(得分:2)

对于这种情况,通常你会有一个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,但是查看所有这些内容都无关紧要