我想创建一个基于集合(例如List)的列的WebGrid。像这样的东西(这显然不起作用):MVC3 WebGrid - 动态创建列(foreach?)
@grid.GetHtml(
columns: grid.Columns(
@foreach (var column in Model.ListOfColumns) {
grid.Column(column.Name, column.Title);
}
)
)
任何聪明的想法?
我想创建一个基于集合(例如List)的列的WebGrid。像这样的东西(这显然不起作用):MVC3 WebGrid - 动态创建列(foreach?)
@grid.GetHtml(
columns: grid.Columns(
@foreach (var column in Model.ListOfColumns) {
grid.Column(column.Name, column.Title);
}
)
)
任何聪明的想法?
你可以ViewBag像下面。
控制器:
List<WebGridColumn> columns = new List<WebGridColumn>();
columns.Add(new WebGridColumn() { ColumnName = "Id", Header = "Id" });
columns.Add(new WebGridColumn() { ColumnName = "Name", Header = "Name" });
columns.Add(new WebGridColumn() { ColumnName = "Location", Header = "Location" });
columns.Add(new WebGridColumn() { Format = (item) => { return new HtmlString(string.Format("<a href= {0}>View</a>", Url.Action("Edit", "Edit", new { Id = item.Id }))); } });
ViewBag.Columns = columns;
查看:
@grid.GetHtml(tableStyle: "ui-widget ui-widget-content",
headerStyle: "ui-widget-header",
columns: ViewBag.Columns
)
试试这个:
@{
List<WebGridColumn> cols = new List<WebGridColumn>();
foreach(var column in Model.ListOfColumns)
{
cols.Add(grid.Column(column.Name, column.Title));
}
}
@grid.GetHtml(
columns: cols
)
你可以使用的辅助方法
public static class GridExtensions
{
public static WebGridColumn[] DynamicColumns(
this HtmlHelper htmlHelper,
WebGrid grid
)
{
var columns = new List<WebGridColumn>();
columns.Add(grid.Column("Property1", "Header", style: "record"));
columns.Add(grid.Column("Property2", "Header", style: "record"));
columns.Add(grid.Column("Actions", format: (item) => { return new HtmlString(string.Format("<a target='_blank' href= {0}>Edit </a>", "/Edit/" + item.Id) + string.Format("<a target='_blank' href= {0}> Delete</a>", "/Delete/" + item.Id)); }));
return columns.ToArray();
}
用法:
@{
var grid = new WebGrid(Model);
}
@grid.GetHtml(columns: grid.Columns(Html.DynamicColumns(grid)))
我以前使用foreach循环设法让代码工作,但需要在添加到列集合之前将每列分配给局部变量。局部变量是解决lambda“访问修改曝光”问题所必需的。你的解决方案很整洁,谢谢。 – pfeds