【问题标题】:MVC Is this business logic and should be moved from the view to a model?MVC 这是业务逻辑,应该从视图移到模型吗?
【发布时间】:2014-08-15 17:02:00
【问题描述】:

我试图更好地理解 MVC 模式和关注点分离,特别是关于什么构成“业务逻辑”。我最近被分配到一个现有的 asp.net mvc 4 项目,以前从未使用过 MVC 模式。由于我一直在熟悉该项目和 MVC,因此我在一个类似于以下内容的视图中发现了代码。根据打开视图的对象的 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>

【问题讨论】:

  • int.Parse(@Model.ObjectId.Substring(3, 1)) &gt; 3 应该在模型中。似乎其中很多都可以重构以一起删除 swtich 语句。这可能是您在codereview.stackexchange.com 上发布的内容。
  • @ErikPhilips 同意可以重构很多东西。很明显,列表的标记属于视图。澄清一下:大多数情况下都有不重叠的链接列表,应该在模型中处理哪一层的情况?
  • 我不知道你的代码的其余部分是什么样的,但由于在你当前的代码中你需要的只是clientID、linkId和ObjectId,它可以用@重构为一个类987654324@ 和 &lt;type&gt; Id.

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


【解决方案1】:

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

有时真的很难说,而且可能因人而异。当我查看您的代码时,我会说逻辑不是业务逻辑。这并不意味着它有效或无效。退后一步,意识到这个逻辑可以在控制器或视图中。具有此逻辑的视图意味着您可以使用不同的逻辑重用此模型并获得不同的视图,有时这是完全有效的。其他时候它应该在控制器中,因此视图只能显示应该显示的内容。例如,一些程序员希望控制器中的代码返回视图、部分视图或 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>

尽管由于技术原因或业务规则这可能是不可能的。

【讨论】:

  • 那么在这种情况下,让控制器检查层并获取适当的 id,然后让视图根据传递的 id 打印链接列表是否合适?
  • 我不知道什么是合适的,我不知道规则。我会说我通常专门为每个视图创建一个 ViewModel,它只包含渲染视图的绝对最小值。
【解决方案2】:

据我从可见代码中可以看出,该逻辑不是业务逻辑。有一个开关可以决定哪个视图元素显示如此清晰地与视图相关。

当然可以简化为 100 行 switch 语句闻起来有点难看,但 MVC 关注点分离没有明显问题。乍一看,逻辑是正确的,但我会花一些时间让它更简单。

【讨论】:

  • 好吧,虽然是丑陋的代码需要重构,但基本上还是适合视图的。
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2016-05-20
  • 1970-01-01
  • 2011-04-20
  • 2012-04-25
  • 2011-11-15
相关资源
最近更新 更多