Esta pregunta es el resultado de lo que noté al intentar responder another question. Y ahora tengo curiosidad por saber por qué <asp:TextBox runat="server" Visible="<%= true %>" />
conduce a un error de compilación, y no a un TextBox visible como hubiera esperado.¿Por qué las expresiones <%= %> como valores de propiedad en un servidor controlan conducen a errores de compilación?
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 '<% = true%>' para la propiedad 'Visible'.
Si i en lugar zanja el runat = "server" y combina la <%= %>
con el código HTML estándar, como esto:
<input type="button" id="Button1" visible='<%= true %>' />
A continuación, el analizador simplemente divide la cantidad 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("<input type=\"button\" id=\"Button1\" visible='");
__w.Write(true);
__w.Write("' />");
Como lo último que me di cuenta ... Cuando trato con <%# %>
+ Control.DataBind(), entonces me sale lo que cabría esperar. 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 en realidad evalúa el contenido de la expresión <%# %>
. El analizador termina generando el 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;
}
Desde:
<asp:Button ID="databoundButton" Visible='<%# true %>' runat="server" />
Aviso la button.Visible = true;
que es el resultado de la expresión <%# %>
.
Así que 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 (que dudo porque no es un problema nuevo con la versión actual de ASP.NET), o hay una buena razón por la cual no podemos usar <%= %>
así?
Gracias, tiene sentido, encaja con lo que vi en Reflector. Supongo que esperaba que el efecto "Response.Write" fuera solo una consecuencia de cómo lo usé, y no de la manera en que se hizo funcionar. –
+1 Tuve que leer esta respuesta dos veces para entender el punto: ** las salidas directamente a la secuencia de respuesta, y el marcado asp no es parte de la secuencia de respuesta ** aka, '<%=true%>' no termina en el '
Andomar
También debe llamar a Button1.DataBind() en el método PageLoad –