2

MVC3WebGridコントロールを使用してエンティティのリストをレンダリングしています。ユーザー、アイテム、注文などのリストを表示するページのようなインデックスがあると仮定します。これらすべてのエンティティにはIDという列があります。

WebGridは見栄えがよく、リストがレンダリングされたら、他のすべての列の前に、編集、削除、詳細の3つのアクションリンクを追加したいだけです。

次のコードを追加しても機能しますが、すべてのページでこのコードを繰り返したくありません。

@grid.GetHtml(columns: grid.Columns(
                grid.Column(header: "",
                   style: "text-align-center",
                       format: (item) => new
                        HtmlString(Html.ActionLink("Edit", "Edit", new { ID = item.ID     }).ToString() + " | " +
                                    Html.ActionLink("Details", "Details", new { ID = item.ID }).ToString() + " | " +
                                    Html.ActionLink("Delete", "Delete", new { ID = item.ID }).ToString()
                                   )
            ),
            grid.Column("FirstName"),
            grid.Column("LastName"),
            grid.Column("EmailAddress")
        )

基本的に私が欲しいのは@Grid.Render(Model)と言うことです...そしてそれは最初の3つのアクションリンクを作成するはずであり、それらはモデルのすべての列をレンダリングします。

JQueryグリッドやMVCContribなどがあることは知っていますが、それらはオプションではありません。

コメントやヒントをいただければ幸いです。

4

1 に答える 1

4

グリッドのカスタム拡張メソッドを作成できます。

using System.Linq;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class WebGridExtensions
{
    public static IHtmlString MyGetHtml(this WebGrid grid, HtmlHelper html)
    {
        var columns =
            (from n in grid.ColumnNames
             select new WebGridColumn { ColumnName = n, CanSort = true }
             ).ToList<WebGridColumn>();
        columns.Insert(0, grid.Links(html));
        return grid.GetHtml(columns: columns, exclusions: new[] { "ID" });
    }

    public static WebGridColumn Links(this WebGrid grid, HtmlHelper html)
    {
        return grid.Column(
            header: "",
            style: "text-align-center",
            format: item => new HtmlString(
                html.ActionLink("Edit", "Edit", new { ID = item.ID }).ToString() + " | " +
                html.ActionLink("Details", "Details", new { ID = item.ID }).ToString() + " | " +
                html.ActionLink("Delete", "Delete", new { ID = item.ID }).ToString()
            )
        );
    }
}

そしてそれを使用します:

@model IEnumerable<MyViewModel>
@{
    var grid = new WebGrid(Model);
}
@grid.MyGetHtml(Html)

または、他の列の構築を制御する場合:

@grid.GetHtml(
    columns: grid.Columns(
        grid.Links(Html),
        grid.Column("FirstName"),
        grid.Column("LastName"),
        grid.Column("EmailAddress")
    )
)
于 2012-07-28T07:02:56.400 に答える