我對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