MVC这个业务逻辑应该从视图移动到模型吗?

时间:2014-08-15 17:02:00

标签: c# asp.net-mvc-4 business-logic

我正在努力更好地理解MVC模式和关注点的分离,特别是关于什么构成"业务逻辑"。我最近被分配到现有的asp.net mvc 4项目,之前从未使用过MVC模式。由于我一直熟悉该项目并且通常使用MVC,因此我在View中找到了类似于以下内容的代码。根据打开视图的对象的mapLayer,生成基本上不同的链接列表(顺便说一句,原始的switch语句几乎是100行)。在我看来,这种逻辑是"业务逻辑"并且应该重新计算到模型中而不是留在视图中。我对么?为什么,为什么不呢?

示例查看代码段(通用):

<ul id="tabsMore">
    @switch (Model.MapLayerId)
    {
    case "LayerID1":
        <li><a href="@Url.Action("linkNameX", new { clientID = Model.Type1Model.clientID })">displayNameX<span>&nbsp;</span></a></li>
        ...
        break;
    case "LayerID2":
        <li><a href="@Url.Action("linkNameY", new { clientID = Model.Type1Model.clientID })">displayNameY<span>&nbsp;</span></a></li>
        ...
        if (int.Parse(@Model.ObjectId.Substring(3, 1)) > 3)
        {
          <li><a href="@Url.Action("linkNameZ", new {linkId = Model.ObjectId})">displayNameZ<span>&nbsp;</span></a></li>
          ...
        }
        ...
        break;
        ...
    case "LayerIDN":
        <li><a href="@Url.Action("linkNameZ", new { clientID = Model.Type2Model.clientID })">displayNameW<span>&nbsp;</span></a></li>
        ...
        break;
    }
</ul>

2 个答案:

答案 0 :(得分:0)

从可见代码中可以看出,该逻辑不是业务逻辑。有一个开关来决定哪个视图元素显示与视图有关。

肯定可以简化为100行开关声明有点难看但MVC关注点分离没有明显问题。乍一看逻辑是在正确的位置,但我花了一些时间让它变得更简单。

答案 1 :(得分:0)

  

这个业务逻辑是否应该从视图移动到模型?

有时真的很难说,并且可以在人与人之间虔诚。当我查看你的代码时,我会说逻辑不是业务逻辑。这并不意味着它有效或无效。退后一步,意识到这个逻辑可以在控制器或视图中。具有此逻辑的视图意味着您可以使用不同的逻辑重用此模型并获得不同的视图,有时这是完全有效的。其他时候它应该在控制器中,因此视图只能显示应显示的内容。例如,一些程序员希望控制器中的代码返回视图,部分视图或json。如果它是json,它没有逻辑,所以这意味着另一方需要正确的逻辑(除非它在控制器中,然后所有它总是匹配,没有选择)。

我希望代码看起来像:

<ul id="tabsMore">
  @if (Model.IsLink)
  {
    <li><a href="@Url.Action(Model.LinkAction, new { linkId = Model.ID })">
    @Model.DisplayName<span>&nbsp;</span></a></li>
  }
  else
  {
    <li><a href="@Url.Action(Model.LinkAction, new { clientID = Model.ID })">
    @Model.DisplayName<span>&nbsp;</span></a></li>
  }
</ul>

或者你可以使用空参数:

<ul id="tabsMore">
    <li><a href="@Url.Action(Model.LinkAction, 
      new { linkId = Model.LinkID, clientId = Model.ClientId })">
    @Model.DisplayName<span>&nbsp;</span></a></li>
</ul>

虽然出于技术原因或业务规则,这可能是不可能的。