如何在WebGrid中隐藏列?

Tod*_*vis 6 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")
            )
        )
Run Code Online (Sandbox Code Playgroud)

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

                @{ 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")
                )
         }    
     )
Run Code Online (Sandbox Code Playgroud)

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

Tz_*_*Tz_ 5

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

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

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

@grid.GetHtml(...
            columns: cols);
Run Code Online (Sandbox Code Playgroud)

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

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