私が達成しようとしていることは説明が難しいので、もっと情報を提供できるかどうか教えてください。私はWebGridをその手段を超えて使用しようとしていると感じているので、誰かが私が試していることを実行するオープンソースの代替手段を持っているなら、それも役に立ちます。
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を持ちますが、値は異なりますが、フォームのフィールドをすばやく変更すると、新しい検索で新しい結果のセットが返される可能性があります(再度メタデータのセットは互いに同じですが、最初の結果のセットとは異なります)
グリッドの列はメタデータ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)
}
私が解決しようとしているのは、最初に列を生成し、次にこれらの列に行を入力する方法と可能性です。
どんな助けでも本当にありがたいです、ありがとう、マーク