Этот вопрос является результатом того, что я заметил при попытке ответить на еще один вопрос. И теперь им любопытно узнать, почему <asp:TextBox runat="server" Visible="<%= true %>" />
приводит к ошибке компиляции, а не к видимому TextBox, как я ожидал.
Из того, что я обнаружил до сих пор, выражения <%= %>
не переводятся в литеральные элементы управления, как я всегда думал. Но вместо этого он оценивается и записывается непосредственно в HtmlTextWriter при визуализации страницы. Но, по-видимому, анализатор (я не уверен, что это правильный термин для части, переводящей разметку ASP.NET на .NET-код) даже не пытается оценить выражения <%= %>
, когда они используются как значения свойств для сервера управления. Он просто использует его как строку. Я думаю, поэтому я получаю сообщение об ошибке: Невозможно создать объект типа "System.Boolean" из его строкового представления "<% = true% > " для свойства "Видимый".
Если я вместо этого запускаю runat = "server" и объединяет <%= %>
с обычной html-разметкой, например:
<input type="button" id="Button1" visible='<%= true %>' />
Затем анализатор просто разбивает кусок в частях до и после выражения, а затем записывает его в HtmlTextWriter в методе рендеринга. Что-то вроде этого:
__w.Write("<input type=\"button\" id=\"Button1\" visible='");
__w.Write(true);
__w.Write("' />");
Как последнее, что я заметил... Когда я пытаюсь с помощью <%# %>
+ Control.DataBind(), я получаю то, что ожидаю. Он подключает выражение, которое будет использоваться, когда элемент управления привязан к базе данных, но в отличие от выражения <% =% > сгенерированный код фактически оценивает содержимое выражения <%# %>
. Парсер завершает создание следующего:
[DebuggerNonUserCode]
private Button __BuildControldataboundButton()
{
Button button = new Button();
base.databoundButton = button;
button.ApplyStyleSheetSkin(this);
button.ID = "databoundButton";
button.DataBinding += new EventHandler(this.__DataBindingdataboundButton);
return button;
}
public void __DataBindingdataboundButton(object sender, EventArgs e)
{
Button button = (Button) sender;
Page bindingContainer = (Page) button.BindingContainer;
button.Visible = true;
}
From:
<asp:Button ID="databoundButton" Visible='<%# true %>' runat="server" />
Обратите внимание на button.Visible = true;
, который является результатом выражения <%# %>
.
Итак, мой вопрос: почему выражение в первом примере просто рассматривается как строка, а не оценивается как "true". Выражения несколько схожи для двух других примеров, и они дают код, который я бы ожидал.
Это просто ошибка (что я сомневаюсь, поскольку это не новая проблема с текущей версией ASP.NET), или есть веская причина, по которой нам не разрешено использовать <%= %>
, как это?