2

我想要达到的目标很难解释,所以如果我能提供更多信息,请告诉我。我有一种感觉,我正在尝试超出他们的能力范围使用 WebGrid,所以如果有人有任何开源替代品可以做我正在尝试的事情,那也会有帮助。

我需要从头开始构建 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 的属性。执行搜索时,每个结果将始终具有相同数量的元数据和相同的 InstanceFieldNames,但值不同,但是快速更改表单上的字段,并且新的搜索可能会返回一组新的结果(再次具有相同的元数据集,但与第一组结果不同)

网格的列对应于 Metadata InstanceFieldName,内容对应于 Value。

所以我用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)
}

我要解决的是如何以及如果可能的话首先生成列,然后将行填充到这些列中。

非常感谢任何帮助,谢谢,马克

4

1 回答 1

0

您正在输入具有相同值的行,您应该更改格式:

col.Format = (item) => @Html.Raw(item.metadataValue);
于 2013-04-12T11:03:38.550 回答