¿Por qué las expresiones como valores de propiedad en un servidor de controles conducen a un error de comstackción?

Esta pregunta es el resultado de lo que noté al intentar responder otra pregunta . Y ahora tengo curiosidad por saber por qué <asp:TextBox runat="server" Visible="" /> lleva a un error de comstackción, y no a un TextBox visible como hubiera esperado.

Según lo que he descubierto hasta ahora, las expresiones no están traducidas a controles literales, como siempre he pensado. Pero en su lugar, se evalúa y escribe directamente en HtmlTextWriter cuando se procesa la página. Pero aparentemente el analizador (no estoy seguro de que sea el término correcto para la parte que está traduciendo el marcado ASP.NET al código .NET) ni siquiera intenta evaluar las expresiones , cuando se usan como valores de propiedad para los controles del servidor. Simplemente lo usa como una cadena. Supongo que es por eso que aparece el mensaje de error: No se puede crear un objeto de tipo ‘System.Boolean’ a partir de su representación de cadena ” para la propiedad ‘Visible’ .

Si en cambio abandono el runat = “servidor” y combina el con el marcado html regular, así:

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

Luego, el analizador solo divide el fragmento en partes antes y después de la expresión y luego lo escribe en HtmlTextWriter en el método de renderizado. Algo como esto:

  __w.Write(""); 

Como lo último que noté … Cuando bash con + Control.DataBind (), obtengo lo que esperaría. Conecta la expresión que se utilizará cuando el control está enlazado a datos, pero a diferencia de la expresión , el código generado realmente evalúa el contenido de la expresión . El analizador termina generando lo siguiente:

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

De:

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

Observe el button.Visible = true; ese es el resultado de la expresión .

Entonces mi pregunta es … ¿Por qué la expresión en el primer ejemplo simplemente se trata como una cadena, en lugar de ser evaluada como “verdadera”? Las expresiones son algo similares para los otros dos ejemplos, y arrojan el código que yo esperaba.

¿Es solo un error (lo cual dudo ya que no es un problema nuevo con la versión actual de ASP.NET), o hay una buena razón por la cual no se nos permite usar así?

Esta:

  

No evalúa a esto:

  

< % =%> envía directamente a la secuencia de respuesta, y el marcado asp no es parte de la secuencia de respuesta. Es un error suponer que los operadores < % =%> están realizando cualquier clase de preprocesamiento en el marcado asp.


Además, ayuda a pensar en el ciclo de vida ASP.NET con respecto a los operadores < % #%> y < % =%>.

  • < % #%> tiene una semántica más en común con la asignación de un valor a un objeto. En el ciclo de vida ASP.NET, los operadores < % #%> se evalúan antes de que la página escriba el primer byte en el búfer de respuesta.

  • < % =%> significa lo mismo que Response.Write. Primero tenemos que realizar todos nuestros enlaces de datos y procesamiento de formularios, y generar HTML en el búfer de respuesta al final del ciclo de vida de ASP.NET.