Контекст: Поскольку мы разрабатываем C# MVC3, мы хотели иметь некоторые классы, предназначенные для обработки таблиц на веб-странице. (Разбиение на страницы/поиск/и т. Д.).Lambda Expression присваивает исходный объект
Таким образом, мы, наконец, нашли, что это могло бы быть лучше, чтобы иметь следующие классы:
объекта таблицы, который будет содержать все другие объекты и знает текущей страница/текущий поиск и т.д. ... (информация разной)
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 Димитров), что помощник имеет тип HtmlHelper> и не HtmlHelper. Любая идея, как я могу получить HtmlHelper из HtmlHelper>?
UPDATE:
Person класс следующим образом:
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;
}
}
Спасибо за вашу помощь. Он отлично работает для выражения Person => Person. Но это не для свойств в Person ... Я получаю исключение: «Шаблоны могут использоваться только с доступом к полям, доступом к ресурсам, индексу одномерного массива или однопараметрическим пользовательским выражениям индексатора». когда приходит очередь на выражение «Person => Person.LastMembershipApproval» для оценки ... Любая идея, почему? – Whoami
@Whoami, странно, это сработало, когда я его протестировал. Если вы пришлете мне образец проекта, иллюстрирующий проблему, я могу помочь вам. –
Я добавлю класс Person, чтобы вы могли проверить. ** ОБНОВЛЕНИЕ ** Добавлен класс. – Whoami