在视野中使用逻辑是不好的做法

时间:2016-07-09 17:50:23

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

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

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

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

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

branch_id

3 个答案:

答案 0 :(得分:4)

这不是世界上最糟糕的事情,因为它被用于在视图中显示元素。但是,我会为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)

答案 1 :(得分:2)

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

当您听到或读到关于在您的观看中包含逻辑的错误做法的想法'它通常指的是业务逻辑

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

您展示的逻辑实际上是渲染逻辑 - 您有条件地选择要包含在输出中的相应HTML。我认为没问题。

如果这个逻辑在一个或多个视图中变得太麻烦,你可以在Razor中使用HTML帮助器,PartialViews和函数来帮助解决这个问题。

答案 2 :(得分:0)

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

此外,除了依赖于该逻辑的按钮之外,您可能还有其他项目要显示或处于活动状态。

我建议采用以下方法:

  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>
    }
    
  4. 此外,Bobby Caldwell建议在HtmlHelper中对此进行抽象是有价值的,可以与此方法结合使用。