2009-10-07 10 views
16

Esto se debe a una mala respuesta que di anoche. La curiosidad sobre por qué un método funciona y no el otro me está molestando y espero que alguien más inteligente que yo pueda darme la explicación adecuada (o señalarme la documentación) de por qué el siguiente comportamiento es como es.Por qué <%= %> funciona en una situación pero no en otra

Dado el siguiente código subyacente:

protected string GetMyText(string input) 
{ 
    return "Hello " + HttpUtility.HtmlEncode(input); 
} 

Por qué funciona esto

<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label> 

pero esto no lo hace

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

Editar - Se ha añadido

A riesgo de que mi respuesta tonta original sea rechazada más veces, aquí está el enlace a la pregunta original, ya que algunas de las respuestas que estoy obteniendo ahora ya estaban cubiertas en esa pregunta.

Why can't I set the asp:Label Text property by calling a method in the aspx file?

+0

¿Tiene algo con comillas simples o dobles? Sé que algunos idiomas hacen que todo entre comillas simples de salida pura, mientras que el texto dentro de comillas dobles se evalúa primero ... – peirix

+2

@peirix - Las comillas simples vs. dobles no hacen ninguna diferencia en la sintaxis de ASP.NET. La sintaxis sigue las reglas de sintaxis XML que establecen que puede usar comillas dobles e individuales indistintamente, siempre y cuando siempre termine con la misma cosa con la que comenzó. –

Respuesta

42

Usando <%= %> es igual a poner Response.Write("") en su página. Al hacer esto:

<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label> 

El procesador ASP.NET evalúa el control, a continuación, cuando se representa, imprime el contenido del control de & pide Response.Write donde ve <%=.

En este ejemplo:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

No puede utilizar Response.Write("") en un atributo de texto, ya que no devuelve una cadena. Escribe su salida en el búfer de respuesta y devuelve vacío.

Si desea utilizar la sintaxis de la etiqueta del servidor en el marcado de ASP.NET, debe usar <%# %>. Esta combinación de datos de marcado vincula el valor en las etiquetas. Para que esto funcione, deberá llamar al DataBind() en el método Load() de su página para que funcione.

+0

+1 Sí, usando la respuesta. Escribir dentro de una propiedad de texto no tiene ningún sentido. – RichardOD

+1

Para expandir la declaración '<%# %>' ... Se rellenará al vincular los datos. Esto significa que no pasará nada a menos que se llame a 'DataBind()' en el control o su contenedor. Es posible llamar a 'Page.DataBind()' en el evento 'OnLoad' (como dijo Dan) si nada más provoca el enlace de datos en el control, pero eso no es necesario si el control ya está enlazado a datos. – Blixt

+0

Esta es la primera vez que veo el constructo <%= %> y su explicación. ¿Alguien sabe de una buena fuente para explicar en detalle todas las construcciones <%...%>, qué hacen y cuándo usarlas? –

2

formato incorrecto:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

formato adecuado con el uso de los recursos:

<asp:Label ID="Label1" runat="server" Text='<%$ Resources:Resource, MyText %' /> 
4

Debido a que son ambas instrucciones del lado del servidor - la segunda pieza de código es equivalente a:

<asp:Label ID="Label1" runat="server" Text='Response.Write(GetMyText("LabelText"))' /> 
1

Hacer esto sobre los controles de servidor, si usted tiene su labelText en un archivo de recursos global:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources: resourceName, LabelText %>" /> 
4

<% = GetMyText ("LabelText")%> básicamente significa

Respuesta.Escribir (GetMyText ("LabelText"));

Aquí está bien. <% = GetMyText ("labelText")%>

Sin embargo, cuando se utiliza este:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

Básicamente significa:

Label1.Text = Response.Write (GetMyText ("labelText"));

que es una declaración incorrecta.

1

Para que funcione en el segundo caso, que querría que la siguiente manera:

<asp:Label ID="Label1" runat="server" Text="<%# GetMyText("LabelText") %>" /> 

Y entonces tendrá que ser Label1 enlace de datos.

Cuestiones relacionadas