【发布时间】:2011-02-10 07:52:50
【问题描述】:
我正在向我的用户数据模型返回一个 IList。我希望我的最终用户能够 选择他们想要查看的列。
我知道我可以用一个巨大的“if 语句”来做到这一点,但是,我知道一定有更好的方法。
我用列名创建了一个枚举。我觉得如果我能接受 IListItem.EnumName 我会被设置。但是,我不太确定如何做到这一点。
建议?
【问题讨论】:
标签: c# asp.net asp.net-mvc dynamic
我正在向我的用户数据模型返回一个 IList。我希望我的最终用户能够 选择他们想要查看的列。
我知道我可以用一个巨大的“if 语句”来做到这一点,但是,我知道一定有更好的方法。
我用列名创建了一个枚举。我觉得如果我能接受 IListItem.EnumName 我会被设置。但是,我不太确定如何做到这一点。
建议?
【问题讨论】:
标签: c# asp.net asp.net-mvc dynamic
我通过创建一个 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) 和许多其他内容时,使用类似的机制。
【讨论】: