Чего я пытаюсь достичь, трудно объяснить, поэтому, пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию. У меня такое чувство, что я пытаюсь использовать WebGrids не по средствам, поэтому, если у кого-то есть какие-либо альтернативы с открытым исходным кодом, которые будут делать то, что я пытаюсь сделать, это также будет полезно.
Мне нужно создать WebGrid с нуля, потому что возвращаемый в него контент (столбцы и значения) меняется в зависимости от других критериев моей формы. У меня это работает в нескольких простых строках кода в таблице, но я хотел использовать WebGrid для стилизации, сортировки и разбиения по страницам.
@model DocumentSearchViewModel
@if ((this.Model != null) && (this.Model.SearchResults != null) && (this.Model.SearchResults.Count() > 0))
{
<table>
<thead>
<tr>
<th>Document</th>
@foreach (var metadata in this.Model.SearchResults.Metadata)
{
<th>
@metadata.InstanceFieldName
</th>
}
</tr>
</thead>
<tbody>
@foreach (var document in this.Model.SearchResults)
{
<tr>
<td>
@Html.ActionLink(document.Id.ToString(), "Details", new { id = document.Id })
</td>
@foreach (var metadata in document.Metadata)
{
<td>
@metadata.Value
</td>
}
</tr>
}
</tbody>
</table>
}
Итак, чтобы объяснить структуру модели, SearchResults имеет IEnumerable<MetadataModel>
, а эта MetadataModel имеет свойства InstanceFieldName и Value. При выполнении поиска каждый результат всегда будет иметь одинаковое количество метаданных и одни и те же имена InstanceFieldName, но разные значения, однако быстрое изменение поля в форме и новый поиск могут вернуть новый набор результатов (опять же с тем же набором метаданных, что и друг у друга, но отличается от первого набора результатов)
Столбцы сетки соответствуют метаданным InstanceFieldName, а содержимое — значению.
Итак, я сделал все возможное, используя WebGrid, но лучшее, что я могу получить, — это сетка с правильными заголовками столбцов и правильным количеством строк, столбцы содержат правильные данные, но каждая строка одинакова (скопирована из последней ряд).
@{
var grid = new WebGrid(canPage: true, canSort: true, rowsPerPage: Model.PageSize, sortFieldName: Model.Sort, sortDirectionFieldName: Model.SortDir);
grid.Bind(Model.SearchResults, rowCount: Model.DocumentCount);
List<WebGridColumn> cols = new List<WebGridColumn>();
foreach(var metadata in Model.SearchResults.Select(r => r.Metadata).FirstOrDefault())
{
var col = new WebGridColumn();
col.ColumnName = metadata.InstanceFieldName;
col.Header = metadata.InstanceFieldHeader;
col.Style = "gridRow";
col.CanSort = true;
cols.Add(col);
}
foreach (var result in Model.SearchResults)
{
foreach (var col in cols)
{
var metadataValue = result.Metadata.Single(m => m.InstanceFieldName == col.ColumnName).Value;
col.Format = (item) => @Html.Raw("<text>" + metadataValue + "</text>");
}
}
}
@if ((this.Model != null) && (this.Model.SearchResults != null) && (this.Model.SearchResults.Count() > 0))
{
@grid.GetHtml(htmlAttributes: new { id = "documentGrid" }, rowStyle: "gridRow", alternatingRowStyle: "gridRowAlt", columns: cols)
}
Я пытаюсь понять, как и, если возможно, сначала создать столбцы, а затем заполнить строки в эти столбцы.
Любая помощь очень ценится, спасибо, Марк