2010-04-20 113 views
5

我正在將IList返回給我關於用戶的數據模型。我希望我的最終用戶能夠 選擇他們想要查看的列。向ASP.NET MVC視圖中的表動態添加列

我知道我可以用一個巨大的「if語句」來做到這一點,但是我知道必須有更好的方法。

我創建了列名的Enum。我覺得如果我可以採取IListItem.EnumName我會被設置。但是,我不太確定如何做到這一點。

對此提出建議?

回答

5

我通過創建一個IColumn接口,然後創建了一堆可以正確顯示我模型的不同方面的列類來處理這個問題。該視圖然後使用簡單的for循環呈現每列。例如:

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; 
    } 
} 

在你看來,你那麼做這樣的事情:

<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> 
<% } %> 

這一直爲我工作好!

4

您可以考慮使用反射:

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; } 
} 

然後你就可以通過反射很容易地訪問屬性並保存在用戶設置中選擇屬性列表。您可以通過反射訪問顯示名稱太(它不是在這裏):

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

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

您不必創建額外的類型和描述。屬性給你顯示名稱和反射給你列表。這就是ASP.NET MVC的工作原理。當你想在這個框架中使用Html.EditorFor(Model)和許多其他的機制時,會使用類似的機制。

+0

這是否也適用於模型(vs視圖模型)? – 2017-04-13 17:59:10

+0

@HughSeagraves是的。 – LukLed 2017-04-14 07:01:22