所以我想创建一个 MVC 帮助器,用户可以在其中传递表达式集合和集合以从中提取这些值。这将创建一个包含列名称的表,然后是这些列的值列表。
public class ColumnDefinition<T> where T: class
{
public Expression<Func<T,object>> Property { get; set; }
public string DisplayName { get; set; }
public string DefaultValue { get; set; }
public bool IsVisisble { get; set; }
public string CssClass { get; set; }
}
所以助手可能看起来像这样:
public static IHtmlString ToTable<T>(this HtmlHelper helper, IEnumerable<T> list, IEnumberable<ColumnDefinition<T>> columnDefs) where T: class
{
....
}
我知道如何从 中获取属性名称Expression<Func<T,object>>
,但不确定如何为列表编写 select 语句。这应该可以获取值:
var someList= list.Select(() => columnDefs.Select(c => c.Property)).ToList();
我试图弄清楚如何将名称与值对齐。所以一个例子可能是这样的:
var colDef = new List<ColumnDefinition<Foo>>()
{
new ColumnDefinition<Foo>()
{
Property = f => f.Id,
DisplayName = "Foo"
},
new ColumnDefinition<Foo>()
{
Property = f => f.Bar.Name,
}
}
因此,当那组列定义传递给帮助程序时,我想获取所有属性名称,除非 DisplayName 存在(我了解如何获取名称)然后我想为这些列中的每一列写入数据定义。
更新
所以到目前为止我有这个:
public static class DataTablesHelper
{
public static DataTableModel GnerateColumns<T>(IEnumerable<T> list,
IEnumerable<ColumnDefinition<T>> columnDefinitions) where T: class
{
foreach (var o in list)
{
var newList = GetInfo(o, columnDefinitions.ToList());
}
return new DataTableModel();
}
private static List<string> GetInfo<T>(T source, IEnumerable<ColumnDefinition<T>> columnDefinitions) where T : class
{
return columnDefinitions.Select(columnDefinition => columnDefinition.Property(source).ToString()).ToList();
}
}
public class ColumnDefinition<T> where T: class
{
public Func<T,object> Property { get; set; }
public string DisplayName { get; set; }
public string Value { get; set; }
public string SortValue { get; set; }
public bool IsVisisble { get; set; }
public string CssClass { get; set; }
}
这似乎适用于获取值,我可以稍后获取属性名称。理想情况下,最好传入一个字符串格式化程序来格式化输出。
更新 2
因此,使用这种技术已经成为我的核心库的一部分已有一段时间了,我想出了这个来允许简单的格式化:
private static List<string> GetInfo<T>(T source, IEnumerable<ColumnDefinition<T>> columnDefinitions) where T : class
{
var listValues = new List<string>();
foreach (var columnDefinition in columnDefinitions.ToList())
{
var prop = columnDefinition.Property(source);
var definition = columnDefinition;
TypeSwitch.Do(prop, TypeSwitch.Case<DateTime>(p => listValues.Add(p.ToString(definition.Format))),
TypeSwitch.Default(() => listValues.Add(prop.ToString())));
}
return listValues;
}
我添加了一个将容纳格式化程序的字符串。
public class ColumnDefinition<T> where T: class
{
public Func<T,object> Property { get; set; }
public string Format { get; set; }
public string DisplayName { get; set; }
public string Value { get; set; }
public string SortValue { get; set; }
public bool IsVisisble { get; set; }
public string CssClass { get; set; }
}