Мой пример кода выглядит следующим образом:
<asp:Repeater runat="server">
<ItemTemplate><%# Container.DataItem %></ItemTemplate>
</asp:Repeater>
Intellisense утверждает, что Контейнер является полем / переменной типа RepeaterItem
.Переменная-часть говорит мне, что это какой-то особый синтаксический анализ, поскольку он, скорее всего, был бы свойством, если бы он был общедоступным.
В любом случае, мой код анализируется, помимо прочего, в следующем коде привязки данных:
public void __DataBind__control4(object sender, EventArgs e) {
var target = (DataBoundLiteralControl)sender;
var Container = (RepeaterItem)target.BindingContainer;
target.SetDataBoundString(0, Convert.ToString(Container.DataItem, CultureInfo.CurrentCulture));
}
<%# ... %>
- это DataBoundLiteralControl, а Container
- это переменная, подверженная значению intellisense.Это также показывает, что есть переменная target
, которая не отображается в intellisense, но компилируется без проблем.Обратите внимание, что это также дает вам доступ ко всему частному в сгенерированном классе, например, __fileDependencies
.
<%# target %>
работает, а <%# dummy %>
- нет.И хотя при этом <%# __DataBind__control4(null, null) %>
создает две ошибки компиляции, 1) «Наилучшее перегруженное соответствие метода для System.Convert.ToString (object, System.IFormatProvider)» имеет недопустимые аргументы »и 2)« Аргумент 1: невозможно преобразоватьот 'пустоты' до 'объекта' ".
Это выглядит как простой случай того, что написано между <%# ... %>
, помещается в Convert.ToString(..., CultureInfo.CurrentCulture)
.Вероятно, он более продвинутый, включает в себя различные ControlBuilders, TemplateParsers и унцию магии, но я думаю, что моя абстракция работает достаточно хорошо, чтобы понять это.