Динамический контент MVC WebGrid

Чего я пытаюсь достичь, трудно объяснить, поэтому, пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию. У меня такое чувство, что я пытаюсь использовать 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)
}

Я пытаюсь понять, как и, если возможно, сначала создать столбцы, а затем заполнить строки в эти столбцы.

Любая помощь очень ценится, спасибо, Марк


person Mark    schedule 25.01.2013    source источник


Ответы (1)


Вы загружаете строки с одинаковым значением, вы должны изменить формат:

col.Format = (item) => @Html.Raw(item.metadataValue);
person Eduardo Molteni    schedule 12.04.2013