2010-04-20 5 views
5

IList를 사용자에 대한 내 데이터 모델로 반환합니다. 최종 사용자가 에보고 싶은 열을 선택할 수 있기를 바랍니다.ASP.NET MVC 뷰의 테이블에 동적으로 열 추가

나는 거대한 "if 문"으로 이것을 할 수 있다는 것을 알고 있지만, 더 좋은 방법이 있어야한다는 것을 알고 있습니다.

열 이름과 함께 열거 형을 만들었습니다. IListItem.EnumName을 가져 가면 설정할 수 있다고 느낍니다. 그러나, 나는 이것을하는 방법에 관하여 너무 확신하지 않는다.

제안 사항?

답변

5

나는 IColumn 인터페이스를 만든 다음 내 모델의 다른 패싯을 올바르게 표시 할 수있는 열 클래스를 만들어서이 문제를 처리했습니다. 뷰는 각 열을 간단한 for 루프로 렌더링합니다. 예를 들어 : 이것은 나를 위해 잘 작동하고있다

<tr> 
<% foreach (var column in Model.UserColumns) { %> 
<th><%= column.Title %></th> 
<% } %> 
</tr> 

<% foreach (var item in Model.Items) { %> 
<tr> 
    <% foreach (var column in Model.UserColumns) { %> 
    <td><%: column.Render(item) %></td> 
    <% } %> 
</tr> 
<% } %> 

:보기에

public interface IColumn 
{ 
    string Title { get; } 
    string Render(MyModelObject obj); 
} 

public class NameColumn : IColumn 
{ 
    public string Title { get { return "Name"; } } 

    public string Render(MyModelObject obj) 
    { 
     return obj.Name; 
    } 
} 

당신은 다음과 같은 일을 할!

class UserViewModel 
{ 
    [DisplayName("User name")] 
    public string UserName { get; set; } 

    [DisplayName("E-mail address")] 
    public string Email { get; set; } 

    [DisplayName("Age")] 
    public int Age { get; set; } 
} 

그런 다음 당신은 쉽게 반사를 통해 속성에 액세스 할 수 있습니다 및 사용자 설정에서 선택한 속성 목록을 저장합니다

4

당신은 반사를 사용하는 방법에 대해 생각할 수 있습니다. 당신은 (그것을 여기되지 않습니다) 너무 반사를 통해 표시 이름에 액세스 할 수 있습니다

var type = typeof(UserViewModel); 
var properties = type.GetProperties(); 

foreach (PropertyInfo property in properties) 
{ 
    Console.WriteLine(property.Name); 
} 

추가 유형과 설명을 만들 필요가 없습니다. 속성은 표시 이름을 제공하고 반사는 목록을 제공합니다. 이것이 바로 ASP.NET MVC의 작동 방식입니다. 비슷한 메커니즘이 Html.EditorFor (Model) 및이 프레임 워크의 다른 많은 것을 사용하고자 할 때 사용됩니다.

+0

이 또한 모델 (보기 모델과 비교)에서 작동해야합니까? –

+0

@HughSeagraves 예. – LukLed

관련 문제