模仿MVC DisplayExtensions方法(与lambdas的乐趣和混淆)

时间:2013-08-26 18:12:30

标签: asp.net-mvc-4 generics lambda

我正在尝试使用View中可用的流畅界面为MVC开发自己的可编辑数据网格。我的问题实际上是关于使用lambda,而不是数据网格,但上下文可能有助于理解我的问题。无论如何,我有一些看起来像这样的代码:

@model IEnumerable<AdamOneilSoftware.Models.Something>

@{
    var firstItem = Model.FirstOrDefault();
}
@(Html.DataGrid(Model)
    .CssClass("data")
    .TextBox(model => firstItem.Text)
    .TextBox(model => firstItem.Position)
    .Render())

这个编译好了。您可以看到我想使用lambdas来设置数据网格的列。我不明白的是如何在我的数据网格类中对这些lambda做任何事情。我猜测我需要编译/调用表达式,但我仍然坚持使用Invoke部分。这就是我所拥有的:

public DataGridBuilder<TModel> TextBox<TValue>(Expression<Func<TModel, TValue>> expression)
{
    var del = expression.Compile();
    // invoke the delegate?
    var result = del.Invoke(); // but this expects a TModel argument
    return this;
}

Invoke调用需要一个TModel参数(根据Func声明 - 我理解)。但这不起作用 - 这是正确的:

var result = del.Invoke(TModel);

如何在Invoke调用中形成TModel参数?还是我完全朝着错误的方向前进?目标是执行类似DisplayFor和EditorFor方法的操作 - 渲染一些HTML,同时了解目标属性的元数据(DataFormatString,Display标签等)。

1 个答案:

答案 0 :(得分:2)

您需要将视图的Model实例作为参数传递。

您可以在Html.ViewData.Model

中找到