Skip to main content
 首页 » 编程设计

c#之MVC WebGrid 动态内容

2024年01月01日42lyj

我想要实现的目标很难解释,如果我能提供更多信息,请告诉我。我有一种感觉,我正在尝试超出他们的手段使用 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 的属性。执行搜索时,每个结果将始终具有相同数量的元数据和相同的 InstanceFieldNames,但值不同,但是快速更改表单上的字段,并且新的搜索可能会返回一组新的结果(再次具有彼此相同的一组元数据,但与第一组结果不同)

网格的列对应于元数据 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) 
} 

我正在尝试解决的问题是如何以及如果可能首先生成列,然后将行填充到这些列中。

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

请您参考如下方法:

您正在为行提供相同的值,您应该更改格式:

col.Format = (item) => @Html.Raw(item.metadataValue);