我是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()可能吗?
包围它们答案 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。