そのため、ユーザーが式のコレクションとそれらの値を取得するコレクションを渡すことができる MVC ヘルパーを作成したいと考えています。これにより、列 Names を含むテーブルが作成され、次にそれらの列の値のリストが作成されます。
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; }
}