, поэтому у меня есть пользовательский помощник 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=\"◀\" /><input type=\"button\" value=\"▶\" /></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... %>