컨텍스트 : 우리는 C# MVC3에서 개발 중이므로 웹 페이지의 테이블을 처리하도록 설계된 클래스가 필요했습니다. (페이지 매김/검색/etc ...).람다 식 지정 소스 객체
다른 모든 개체를 유지하고 현재 페이지/현재 검색 등 ... (기타 정보)를 알고있는 것 테이블 개체를
: 그래서 우리는 마침내 다음 수업을 위해 최선을 할 수 있다는 것을 발견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 일 동안 검색 중이며 어떤 답변도 찾을 수 없습니다.
도움 주셔서 감사합니다.
UPDATE :
문제 헬퍼 형 Html 헬퍼>하지 Html 헬퍼 인 것이 (@Groo & @Darin 디미트로프 말했듯)이다. 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