视图应该如何“分离”?

问题描述:

我知道一个视图应该只显示内容,除了显示信息所需的内容外本身不执行任何逻辑。视图应该如何“分离”?

什么是最好的方式,在保持这一点,来处理这种简单的情景:

  1. 用户点击删除项目
  2. 如果该项目仍与其他系统有关,显示“你可以不要删除这个。“
  3. 否则,显示一个确认形式的职位,以行动/删除/编号

我可以在视图中非常容易地做一些事情,如:

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

是否有令人信服的理由提出两点意见并根据有多少孩子,让控制器返回适当的视图?看起来像是简单和关注点分离的折衷。

+0

我将使用两个视图,它总是更好地让你的观点尽可能简单。 –

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

  • 如果它变得不仅仅是儿童?也许还有其他三种关系随着时间的推移出现,现在你需要检查你的观点中的所有关系吗?突然代码味道更强。
  • 把这种类型的逻辑控制器可以让其他的方法的问题更明显或易后,例如,增加一个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可以使用儿童数据状态,角色成员资格,经营状况等,但到视图的组合控制器来填充所有这些东西不应该的问题