Пользовательский помощник RenderTable ASP.NET MVC, как добавить некоторые дополнительные функции? - PullRequest
0 голосов
/ 31 декабря 2010

, поэтому у меня есть пользовательский помощник html, который я создаю, и он отображает таблицу из переданного IList. Он отлично работает, но довольно простой.Я хотел бы иметь возможность назначать имена столбцов, которые не выводятся из имени свойства.Например, сейчас я передаю свойство с именем Number , но я бы хотел использовать .

Мне кажется, я видел, как это было сделано с помощью украшений, и я могу только предположить, что он использует отражение, чтобы получить значение, но я не совсем уверен, как его осуществить, но ...

Еще одна вещь, я хотел бы применить способность кманипулировать атрибутами клетки.Например, ячейка должна иметь colspan из x , или к любой другой ячейке может быть применена class.Я думаю, что это также может подпадать под какое-то украшение.

Наконец, я хочу, чтобы некоторые ячейки содержали ссылки, но, честно говоря, я понятия не имею, как это сделать, кроме отправкизавершите строку html как значение свойства для визуализации.

Итак, я публикую здесь свою текущую версию кода с надеждой, что кто-то лучше меня (это будет вы, ;) ) может дать мне несколько советов о том, как выполнить то, что я написал выше.

ОБНОВЛЕНИЕ

Небольшое обновление, IList, передаваемый прямо сейчас, является анонимнымтипа, так что я не уверен, как это играет с украшениями ...

public static class ApplicationExtensions {
    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        IList Items) {
        RenderTable(HtmlHelper, string.Empty, Items, null, false);
    }

    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        IList Items,
        object Attributes) {
        RenderTable(HtmlHelper, string.Empty, Items, Attributes, false);
    }

    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        IList Items,
        IDictionary<string, object> Attributes) {
        RenderTable(HtmlHelper, string.Empty, Items, Attributes, false);
    }

    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        IList Items,
        object Attributes,
        bool RenderTFoot) {
        RenderTable(HtmlHelper, string.Empty, Items, Attributes.ToDictionary(), RenderTFoot);
    }

    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        IList Items,
        IDictionary<string, object> Attributes,
        bool RenderTFoot) {
        RenderTable(HtmlHelper, string.Empty, Items, Attributes, RenderTFoot);
    }

    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        string Caption,
        IList Items,
        object Attributes,
        bool RenderTFoot) {
        RenderTable(HtmlHelper, Caption, Items, Attributes.ToDictionary(), RenderTFoot);
    }

    public static void RenderTable(
        this HtmlHelper HtmlHelper,
        string Caption,
        IList Items,
        IDictionary<string, object> Attributes,
        bool RenderTFoot) {
        if ((Items != null) && (Items.Count > 0)) {
            StringBuilder TableBuilder = (String.IsNullOrEmpty(Caption) ? new StringBuilder() : new StringBuilder().AppendFormat("<caption>{0}</caption>", Caption));

            THead(TableBuilder, Items[0].GetType());
            TBody(TableBuilder, Items);

            if (RenderTFoot) {
                TFoot(TableBuilder, Items[0].GetPropertyCount());
            };

            TagBuilder TagBuilder = new TagBuilder("table");

            TagBuilder.MergeAttributes(Attributes);
            TagBuilder.InnerHtml = TableBuilder.ToString();

            HtmlHelper.ViewContext.HttpContext.Response.Write(TagBuilder.ToString(TagRenderMode.Normal));
        };
    }

    private static void THead(
        StringBuilder TableBuilder,
        Type Item) {
        TableBuilder.Append("<thead><tr>");

        foreach (var Property in Item.GetProperties()) {
            TableBuilder.AppendFormat("<th>{0}</th>", Property.Name);
        };

        TableBuilder.Append("</tr></thead>");
    }

    private static void TBody(
        StringBuilder TableBuilder,
        IList Items) {
        TableBuilder.Append("<tbody>");

        foreach (var Item in Items) {
            PropertyInfo[] Properties = Item.GetType().GetProperties();

            TableBuilder.Append("<tr>");

            foreach (PropertyInfo Property in Properties) {
                TableBuilder.AppendFormat("<td>{0}</td>", Property.GetValue(Item, null));
            };

            TableBuilder.Append("</tr>");
        };

        TableBuilder.Append("</tbody>");
    }

    private static void TFoot(
        StringBuilder TableBuilder,
        int Columns) {
        TableBuilder.AppendFormat("<tfoot><tr><td colspan=\"{0}\"><input type=\"button\" value=\"&#9664;\" /><input type=\"button\" value=\"&#9654;\" /></td></tr></tfoot>", Columns);
    }

    private static int GetPropertyCount(
        this object Item) {
        return Item.GetType().GetProperties().Count();
    }

    private static IDictionary<string, object> ToDictionary(
        this object Object) {
        return Object.GetType().GetProperties().ToDictionary(
            k =>
                (k.Name),
            v =>
                (v.GetValue(Object, null)));
    }
}

И он используется так:

<% Html.RenderTable(Model) // lowest overload... %>

Ответы [ 2 ]

0 голосов
/ 31 декабря 2010

"так что я не уверен, как это играет с украшениями ..."

Это не так.Вы не сможете получить метаданные от анона.

0 голосов
/ 31 декабря 2010

Возможно, вы захотите взглянуть на Html.Grid из ASP.NET MVC 3 RC2 . Это должно быть намного проще, чем написать свой собственный помощник.

...