Контекст:
Поскольку мы разрабатываем на C # MVC3, мы хотели иметь несколько классов, предназначенных для обработки таблиц на веб-странице. (Нумерация страниц / поиск / и т. Д.).
Итак, мы наконец обнаружили, что лучше всего иметь следующие классы:
Объект таблицы, который будет содержать все другие объекты и знает текущую страницу / текущий поиск и т. Д. (Разная информация)
public class Table<T> where T : IPrivateObject
{
...
public ICollection<Column<T>> Columns { get; set; }
public ICollection<Row<T>> Rows { get; set; }
public ICollection<RowMenu<T>> Menus { get; set; }
public ICollection<T> Items { get; set; }
public Table(
ICollection<T> inputItems,
ICollection<Column<T>> columns,
ICollection<RowMenuItem<T>> rowMenuItems,
...)
{
...
this.Columns = columns;
}
Объект столбца, который знает, какое свойство должно отображаться, и значение заголовка
public class Column<T> where T : IPrivateObject
{
public string Value { get; set; }
public Expression<Func<T, object>> Property { get; set; }
public Column(Expression<Func<T, object>> property, string value)
{
this.Property = property;
this.Value = value;
}
}
Другие классы не очень интересны, поэтому я не буду публиковать их здесь.
В контроллере мы используем следующие классы:
public ActionResult Index(string search = null, string sort = null, int order = 1, int take = 10, int page = 1)
{
ICollection<Person> people = prismaManager.PersonManager.Search(search);
ICollection<Column<Person>> columns= new List<Column<Person>>();
columns.Add(new Column<Person>(Person => Person, "Person"));
columns.Add(new Column<Person>(Person => Person.LastMembershipApproval, "Last Membership approval"));
Table<Person> table = people.ToTable(columns);
}
Сейчас мы пишем помощника, который будет правильно отображать таблицу.
Он хорошо работает для заголовка, но мы сталкиваемся с проблемой выражений, когда хотим использовать помощник @ Html.DisplayFor ().
Вот что у нас есть для контента:
private static string TableRows<T>(HtmlHelper<Table<T>> helper, Table<T> table) where T : IPrivateObject
{
StringBuilder sb = new StringBuilder();
foreach (var item in table.Items)
{
sb.AppendLine("<tr>");
foreach (var column in table.Columns)
{
sb.AppendLine("<td>");
sb.AppendLine(helper.DisplayFor(obj => ??? ).ToString()); // How should I use the Expression that is stored in the column but for the current element ?
sb.AppendLine("</td>");
}
sb.AppendLine("</tr>");
}
return sb.ToString();
}
Чтобы это работало, мы должны установить значение параметра «Персона» из выражения, хранящегося в столбце, для текущего элемента.
new Column<Person>(Person => Person, "Person"));
Как мы должны это сделать?
Должны ли мы (если это возможно) изменить выражение, чтобы установить значение?
Должны ли мы воссоздать новое выражение, используя старое как основное выражение?
Я искал 3 дня и не могу найти ответы.
Спасибо за вашу помощь.
ОБНОВЛЕНИЕ:
Проблема в том (как сказал @Groo & @Darin Dimitrov), что Помощник имеет тип HtmlHelper>, а не HtmlHelper.
Любая идея, как я мог бы получить HtmlHelper из HtmlHelper>?
ОБНОВЛЕНИЕ:
Класс персонажа выглядит следующим образом:
public class Person : IPrivateObject
{
public int Id { get; set; }
public int? AddrId { get; set; }
[DisplayName("First Name")]
[StringLength(100)]
[Required]
public string FirstName { get; set; }
[DisplayName("Last Name")]
[StringLength(100)]
[Required]
public string LastName { get; set; }
[DisplayName("Initials")]
[StringLength(6)]
public string Initials { get; set; }
[DisplayName("Last membership approval")]
public Nullable<DateTime> LastMembershipApproval { get; set; }
[DisplayName("Full name")]
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
public override string ToString()
{
return FullName;
}
}