【问题标题】:Is it bad practice to have logic in view考虑逻辑是不好的做法
【发布时间】:2016-07-09 17:50:22
【问题描述】:

我有一张桌子,上面的每个项目都有一个状态或状态,根据这个状态,您可以购买一个项目或将其设置在等待列表中。

为此,我在 Razor 视图中有一个 @if 语句,我在其中检查状态,然后有条件地选择要为适当操作呈现的按钮。

我在会话和角色的其他视图中有一些类似的逻辑。

这是一个好习惯吗?还有其他方法吗?

@if( @item.status == 1 ) {
     <a class="btn btn-default" href="Items/Buy/@item.id">Buy</a>
} else if ( item.status == 2 ) {
    <a class="btn btn-default" href="Items/SetList/@item.id">Add To List</a>
}

【问题讨论】:

  • 更多逻辑可能会变坏,您可以检查部分视图
  • 逻辑是视图逻辑,可以在视图中

标签: asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

这不是世界上最糟糕的事情,因为它被用来在视图中显示元素。但是,我会为 HtmlHelper 创建一个扩展方法来呈现您尝试创建的操作链接。比如:

public static class HtmlHelperExtensions
{
    public static HtmlString RenderStatus(this HtmlHelper helper, ItemModel item)
    {
        if (item.status == 1)
        {
            return helper.ActionLink("Buy", "Buy", "Items", new { @class = "btn btn-default" });
        }

        if (item.status == 2)
        {
            return helper.ActionLink("Add To List", "SetList", "Items", new { id = item.Id }, new { @class = "btn btn-default" });
        }

        return new MvcHtmlString("");
    }
}

那么在你看来,你需要做的就是打电话

@Html.RenderStatus(item)

【讨论】:

  • 哦,谢谢你,它看起来比视图中的所有内容要好得多,我想它可以在 WebGrid 中使用,因为我实际上使用的是没有分页和排序的手工表格
【解决方案2】:

你这样做的方式没有任何问题。

当您听到或读到“在视图中包含逻辑是不好的做法”的想法时,通常指的是业务逻辑

没有什么可以阻止将模型传递到具有各种可用方法的视图中,然后可以从视图中的代码执行 - (但这是你应该避免的 - 而不是得到这个在控制器动作中完成)。

您展示的逻辑实际上是渲染逻辑——您有条件地选择适当的 HTML 以包含在您的输出中。在我看来完全没有问题。

如果此逻辑在一个或多个视图中变得过于繁琐,您可以使用 HTML 助手、PartialViews 和 Razor 中的函数来帮助解决该问题。

【讨论】:

    【解决方案3】:

    虽然我从根本上同意您所做的是在技术上呈现逻辑这一事实,但确定是否可以购买或添加某些东西可以被视为业务逻辑。

    此外,除了按钮之外,您可能还有其他项目,这些项目依赖于要显示或激活的逻辑或其他内容。

    我会建议以下方法:

    1. 在您的视图上定义一个或多个bool 属性,例如CanBuy
    2. 属性的值可以在控制器中设置,也可以在视图中的属性定义中设置,像这样

      public bool CanBuy
      {
          get { return (status == 1); }
      }
      
    3. 那么在您看来,您会像这样简化if 语句:

      @if(@item.CanBuy ) {
          <a class="btn btn-default" href="Items/Buy/@item.id">Buy</a>
      } else if ( item.CanAdd ) {
          <a class="btn btn-default" href="Items/SetList/@item.id">Add To List</a>
      }
      

    此外,Bobby Caldwell 的建议在 HtmlHelper 中抽象这一点很有价值,可以与此方法结合使用。

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多