簡體   English   中英

動態地將列添加到ASP.NET MVC視圖中的表

[英]Dynamically adding columns to a table in an ASP.NET MVC view

我將IList返回到我的用戶數據模型。 我希望我的最終用戶能夠選擇他們想要查看的列。

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

我創建了一個帶有列名的Enum。 我覺得如果我可以使用IListItem.EnumName我將被設置。 但是,我不太清楚如何做到這一點。

建議?

我通過創建一個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>
<% } %>

這對我來說效果很好!

你可以考慮使用反射:

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)和許多其他方法時,會使用類似的機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM