我对C#中的“Action”概念和一般的委托有点新鲜。需要帮助来理解MVCContrib中的这段代码Grid
我想研究如何在MVC中构建自定义html组件,并且我选择了MVCContrib的网格组件来启动。
要添加列,通常我们做
<%= Html.Grid(Model).Columns(column =>
{
column.For(model => model.Date).Format("{0:d}");
column.For(model => model.DayAmount);
column.For(model => model.LeaveType);
})
%>
,我看到列的源像下面
public IGridWithOptions<T> Columns(Action<ColumnBuilder<T>> columnBuilder)
{
var builder = new ColumnBuilder<T>();
columnBuilder(builder);
foreach (var column in builder)
{
if (column.Position == null)
{
_gridModel.Columns.Add(column);
}
else
{
_gridModel.Columns.Insert(column.Position.Value, column);
}
}
return this;
}
我感到困惑的是Action参数在这种情况下,类型是CustomBuilder,那么“CustomBuilder”对象何时实例化?
我想,我可以重写上面
Html.Grid(Model).Columns(delegate(CustomBuilder<T> column)
{
});
或略偏明确为
Html.Grid(Model).Columns(new Action<CustomBuilder<T>>(delegate(CustomBuilder<T> column)
{
});
);
那么,我们说,当行动与“新”的实例调用语句上面的关键字,参数“CustomBuilder”也被实例化了?
最后,在
“public IGridWithOptions<T> Columns(Action<ColumnBuilder<T>> columnBuilder)
”
功能,
的前两行是
var builder = new ColumnBuilder<T>();
columnBuilder(builder);
他们做些什么?看起来像它正在实例化ColumBuilder对象并将其作为参数传递给Action方法columBuilder。这是你实例化参数的地方吗?
谢谢大家。
@谢谢彼得。我阅读所有文章,仍然很难将上面这些具体例子中的点连接起来,这是我学习的方式。不管怎么说,还是要谢谢你。 – Liming