Asp.net mvc 考虑逻辑是一种不好的做法吗

Asp.net mvc 考虑逻辑是一种不好的做法吗,asp.net-mvc,razor,asp.net-mvc-5,Asp.net Mvc,Razor,Asp.net Mvc 5,我有一张桌子,上面的每一件物品都有一个状态,根据这个状态,你可以购买一件物品,也可以将它放在等待列表中 为此,我在Razor视图中有一个@if语句,在该语句中,我检查状态,然后有条件地选择为适当的操作呈现哪个按钮 在会话和角色的其他视图中,我有一些类似的逻辑 这是一种好的做法吗?还有其他方法吗 @if( @item.status == 1 ) { <a class="btn btn-default" href="Items/Buy/@item.id">Buy</a&g

我有一张桌子,上面的每一件物品都有一个状态,根据这个状态,你可以购买一件物品,也可以将它放在等待列表中

为此,我在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>
}
@if(@item.status==1){
}否则如果(item.status==2){
}

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

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

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

没有任何东西可以阻止我们将模型传递到一个视图中,该视图上有各种可用的方法,然后可以从视图中的代码执行这些方法(但这是您应该避免的——而不是在控制器操作中完成)

您显示的逻辑实际上是呈现逻辑——您正在有条件地选择要包含在输出中的适当HTML。我认为没问题


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

虽然我基本上同意您所做的是从技术上呈现逻辑,但确定是否可以购买或添加某些内容可以被视为业务逻辑

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

我建议采取以下办法:

  • 在视图中定义一个或多个
    bool
    属性,例如
    CanBuy
  • 属性的值可以在控制器中设置,也可以在视图的属性定义中设置,如下所示

    public bool CanBuy
    {
        get { return (status == 1); }
    }
    
  • 然后在您看来,您将简化
    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>
    }
    
    @if(@item.CanBuy){
    }如有其他情况,则(项目编号:CanAdd){
    }
    

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

    如果使用更多的逻辑,可能会变得不好,你可以检查部分视图。逻辑是视图逻辑,所以在视图中很好哦,谢谢你,伙计,它看起来比在视图中拥有所有内容要好得多,我想它可以用在WebGrid中,因为我实际上使用的是手工制作的表格,没有分页和排序