如何在WebGrid中隐藏列?

时间:2011-05-12 17:18:16

标签: asp.net-mvc-3

我是MVC3的新手 - 我正在使用WebGrid在网站上显示我正在进行的拍卖的一些列。这会显示一个显示最新出价的网格。除管理员以外的任何人登录时,他们应该只看到出价金额和日期/时间。当管理员登录时,他们应该看到所有列(名称和联系信息)。我想我可能不得不以某种方式在代码中按摩它,但我想知道是否有办法在Razor标记中处理它?这是我现在的:

            @{ var grid = new WebGrid(Model.Bids.OrderByDescending(b => b.BidAmount)); }
        @grid.GetHtml(
        tableStyle: "grid",
        headerStyle: "head",
        alternatingRowStyle: "alt",
        columns: grid.Columns(
            grid.Column("BidAmount", format: @<text>$@item.BidAmount</text>),
            grid.Column("BidDateTime"),
            grid.Column("FirstName"),
            grid.Column("LastName"),
            grid.Column("Email"),
            grid.Column("PhoneNumber")
            )
        )

所以我想用伪代码做的事情是这样的:

                @{ var grid = new WebGrid(Model.Bids.OrderByDescending(b => b.BidAmount)); }
            @grid.GetHtml(
            tableStyle: "grid",
            headerStyle: "head",
            alternatingRowStyle: "alt",
            columns: grid.Columns(
                grid.Column("BidAmount", format: @<text>$@item.BidAmount</text>),
                grid.Column("BidDateTime"),
@if(userIsAdmin){
                grid.Column("FirstName"),
                grid.Column("LastName"),
                grid.Column("Email"),
                grid.Column("PhoneNumber")
                )
         }    
     )

可以这样做吗?如果没有,任何关于如何处理它的想法?我需要编写两个不同的WebGrid代码,并用if()可能吗?

包围它们

1 个答案:

答案 0 :(得分:5)

如果首先将第一个代码块中的列列表组成一个变量(cols):

@{
var grid = ...;
IEnumerable<WebGridColumn> cols = grid.Columns(... the common columns ...);
if (isAdmin)
  cols = cols.Concat(grid.Columns(... the admin columns ...); 
}

并将其传递给GetHtml()方法:

@grid.GetHtml(...
            columns: cols);

我认为对于Concat方法,您需要像往常一样使用System.Linq的命名空间。或者,您可以使用List<WebGridColumns>并使用AddRange。

关键是GetHtml期望columns参数IEnumerable<WebGridColumn>。 grid.Columns辅助方法只不过是一个带有params数组参数的方法,因此你可以一个接一个地“列出”列,但实际上你是这样组成一个params数组。但是,您可以使用C#中可以想象的任何有效方法来组成列的列表(IEnumerable),然后可以将其传递给GetHtml。