Почему выражения как значения свойств на сервере-управления приводят к ошибкам компиляции?

Этот вопрос является результатом того, что я заметил, пытаясь ответить на другой вопрос . И теперь им любопытно узнать, почему <asp:TextBox runat="server" Visible="" /> приводит к ошибке компиляции, а не к видимому TextBox, как я ожидал.

Из того, что я обнаружил до сих пор, выражения не переводились в литеральные элементы управления, как я всегда думал. Но вместо этого он оценивается и записывается непосредственно в HtmlTextWriter при визуализации страницы. Но, по-видимому, синтаксический анализатор (я не уверен, что это правильный термин для части, переводящей разметку ASP.NET в .NET-код) даже не пытается оценить выражения , когда они используются как значения свойств для управления сервером. Он просто использует его как строку. Я думаю, поэтому я получаю сообщение об ошибке: Невозможно создать объект типа «System.Boolean» из его строкового представления «» для свойства «Видимый» .

Если я вместо этого запускаю runat = “server” и объединяет с обычной html-разметкой, вот так:

 <input type="button" id="Button1" visible='' /> 

Затем парсер просто разбивает кусок в частях до и после выражения, а затем записывает его в HtmlTextWriter в методе рендеринга. Что-то вроде этого:

  __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; } 

Из:

 <asp:Button ID="databoundButton" Visible='' runat="server" /> 

Обратите внимание на button.Visible = true; то есть результат выражения .

Поэтому мой вопрос: почему выражение в первом примере просто рассматривается как строка, вместо того, чтобы оцениваться как «истина». Выражения несколько схожи для двух других примеров, и они дают код, который я бы ожидал.

Это просто ошибка (что я сомневаюсь, так как это не новая проблема с текущей версией ASP.NET), или есть веская причина, почему нам не разрешено использовать как это?

Эта:

  

Не оценивает это:

  

<% =%> выводит непосредственно в stream ответов, а разметка asp не является частью streamа ответов. Ошибочно предположить, что операторы <% =%> выполняют любую предварительную обработку на разметке asp.


В стороне, это помогает думать о жизненном цикле ASP.NET в отношении операторов <% #%> и <% =%>.

  • <% #%> имеет семантику больше общего с назначением значения объекту. В жизненном цикле ASP.NET операторы <% #%> оцениваются до того, как страница записывает первый байт в буфер ответа.

  • <% =%> означает то же, что и Response.Write. Сначала нам нужно выполнить всю нашу обработку данных и обработку формы и вывести HTML в буфер ответа в самом конце жизненного цикла ASP.NET.

Interesting Posts

Как удалить папку, вложенную достаточно глубоко, и избежать «слишком большого имени файла»?

Почему бы не использовать оператор instanceof в дизайне ООП?

Как читать хорошо сформированный XML в Java, но пропустить схему?

Почему printf не сбрасывается после вызова, если в строке формата не указана новая строка?

Отключить прокрутку в списке

Что именно делает делегат в проекте xcode ios?

Как вернуть изображение из $ http.get в AngularJS

Является ли segmentation fault действительным неопределенным поведением, когда мы ссылаемся на нестатический элемент данных

Вычисление разницы во времени hh: mm: ss format

Доступ к родительским данным во вложенном ретрансляторе, в HeaderTemplate

Картинка для Android на стене Facebook

Использование специального сервлета автоматического запуска для инициализации при запуске и совместного использования данных приложения

Какова цель инструкции «ПАУЗА» в x86?

Что такое указатель void и что такое пустой указатель?

Каков наилучший подход для использования Enum в качестве одноэлементной на Java?

Давайте будем гением компьютера.