Я просто не могу представить следующий код вместе в исходном коде MVC Webgrid.DynamicObject? Как работает следующий код?
Когда мы строим столбец сетки, мы сказать
grid.Column("Id", format: (item) => item.GetSelectLink(item.Id)),
«элемент» является параметром лямбда, очевидно, и это на самом деле «WebGridRow» класса. (Я ДУМАЮ !! если я не ошибаюсь) Посмотреть исходный код здесь
https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Helpers/WebGrid/WebGridRow.cs
Мой вопрос здесь, «Id» не является свойством этого класса и так WebGridRow наследует от DynamicObject, как именно " .Id "сопоставлено с" исходным объектом "текущей строки?
Btv, исходный объект "значение объекта" передается через конструктор WebGridRow
public WebGridRow(WebGrid webGrid, object value, int rowIndex)
{
_grid = webGrid;
_value = value;
_rowIndex = rowIndex;
_dynamic = value as IDynamicMetaObjectProvider;
}
определение колонки
public Func<dynamic, object> Format { get; set; }
Колонка вызывается в классе "WeBGridRenderer", как
foreach (var row in webGrid.Rows)
{
.....
foreach (var column in columns)
{
var value = ...Format(column.Format, row).ToString();
...
}
}
Наконец, функция «Формат» в «WeBGridRenderer»
private static HelperResult Format(Func<dynamic, object> format, dynamic arg) {
var result = format(arg);
....
}
Святая моля @ Алксандр! Спасибо, что помогли мне два раза подряд! Я слишком устал прошлой ночью, пытаясь собрать вместе загадку. Какой отличный пост в блоге! Мне, возможно, придется несколько раз прочитать, чтобы полностью «получить». но спасибо и @ Jon за то, что объяснили мне эту пьесу. Если смогу, я бы проголосовал за ваши ответы как лучший ответ для меня в этом году! – Liming