編集可能なテーブルを作成しようとしています。動的テーブルがあり、列を表示または非表示にすることができます。編集ボタンのある追加の列があります。これを押すと、Ajax呼び出しを実行して、編集可能なバージョンの行を取得します。
私のビューモデル:
public class List: IDynamicGridDataModel<View>
{
public List()
{
ColumnOptions = new ColumnOptions();
ColumnOptions.SelectedColumns = new List<string>() { "Address", "ZipCode", "City", "Country" };
ColumnOptions.DisabledColumns = new List<string>() { "Id" };
Items = new List<View>();
}
#region IDynamicGridDataModel<View> Members
public ColumnOptions ColumnOptions { get; set; }
public GridModel<View> GridModel { get; set; }
public IEnumerable<View> Items { get; set; }
#endregion
}
アイテムはどこにありますか:
public class View
{
public long Id { get; set; }
public string Address { get; set; }
public string ZipCode { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
テーブル行を作成するための次の拡張機能があります。
public static MvcHtmlString EditorRowFor<TModel, TRow>(this HtmlHelper<TModel> html, Expression<Func<TModel,TRow>> expression, IEnumerable<string> selectedColumns)
{
var metadataProvider = new DataAnnotationsModelMetadataProvider();
var stringBuilder = new StringBuilder();
stringBuilder.Append("<tr>");
foreach (var column in selectedColumns)
{
var entityParam = Expression.Parameter(expression.ReturnType);
var columnLambda = Expression.Lambda(Expression.Property(entityParam, typeof(TRow), column));
var selectCall = Expression.Call(typeof(Queryable),
"Select",
new Type[] { typeof(TModel), columnLambda.Body.Type },
expression,
columnLambda);
html.EditorCellFor(selectCall);
stringBuilder.AppendLine("</td>");
}
stringBuilder.AppendLine("</tr>");
return new MvcHtmlString(stringBuilder.ToString());
}
この関数は、次のように私のビューから呼び出されます。
@Html.EditorRowFor(m => m.Items.Single(), Model.ColumnOptions.SelectedColumns);
EditorCellForメソッドのシグネチャ:
public static MvcHtmlString EditorCellFor<TModel, TItem>(this HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expression)
私の現在の問題は、selectCallの作成にあります。ラムダ式の式を作成したい:
m => m.Items.Single().Select(i => i.Address)
次のエラーが発生します。
No generic method 'Select' on type 'System.Linq.Queryable' is compatible with
the supplied type arguments and arguments. No type arguments should be
provided if the method is non-generic.
http://www.hanselman.com/blog/TheWeeklySourceCode47ASPNET35DynamicDataFilterRepeatersAndDynamicLinqQueryGeneration.aspxで見たその部分を取り巻くコードのほとんど。
私は午前中ずっと問題を探していましたが、今のところ運がありません。