2012-08-13 8 views
5

Tengo un control de la tela que se ve asíusando <%= %> o <%# %> con runat = server en ASP.NET

 
public class Foo : WebControl 
{ 
    [Bindable(true)] 
    [Category("Default")] 
    [DefaultValue("")] 
    [Localizable(true)] 
    public string Bar { get; set; } 

    protected override void Render(HtmlTextWriter output) 
    { 
    output.WriteLine(Bar); 
    } 
} 

Quiero poner esto de webcontrol en mi página aspx, así:

 
<cc1:Foo Bar="<%= Fa.La.La %>/otherstuff" runat="server" /> 

(obviamente este código se simplifica para mostrar el problema)

En mi método Render, la variable Fa.La.La no se evalúa. Viene como texto sin formato "<% = Fa.La.La%>" ¿Cómo lo evalúo?

No soy particular cómo se pasan las variables. Si las variables se pueden evaluar si se pasan como <% # ...%>, eso funciona bien. El punto es que tengo algunas variables del lado del servidor que quiero evaluar antes/mientras se llama a mi método Render().

Lo único que se me ocurre es usar una expresión regular para capturar los contenidos de <% = ...%> y usar la reflexión o algo así, pero tiene que haber una forma más elegante de hacerlo.

Esta pregunta es bastante similar a using server variables in a href <%= xx %> with runat=server, pero no es exactamente la misma ya que ninguna de las respuestas fue útil.

+0

Trate de usar este NOTA comilla simple y doble comilla diferencia. Espero que pueda resolver el problema – Moons

Respuesta

2

Debería tener que usar la expresión vinculante <%# expr %>.

<cc1:Foo Bar='<%# String.Concat(Fa.La.La,"/otherstuff")%>' runat="server" /> 

y llame DataBind() método en el código subyacente.

public void page_load() 
{ 
    DataBind(); 
} 
+1

Para ampliar esta respuesta, no puedes hacer algo como: Bar = "<% # Fa.La.La%>/otherstuff" Simplemente se renderiza literalmente. La expresión de enlace de datos tiene que ser la única cosa en el atributo, por ejemplo, Bar = '<% # String.Concat (Fa.La.La, "/ otherstuff")%>' Además, las comillas externas deben ser simples Las comillas y las comillas internas deben ser comillas dobles (asumiendo C#, de todos modos). – mhenry1384

5

Bueno, primero debe ser claro para diferenciar entre ambas etiquetas. He aquí algunos puntos que he leído y utilizado prácticamente ..

  • Los <%= expresiones se evalúan en tiempo de render
  • Los <%# expresiones se evalúan en DataBind() tiempo y no se evalúan en absoluto si DataBind() es no llamado
  • <%# expresiones se pueden utilizar como propiedades en los controles del lado del servidor. <%= expresiones no pueden.

leer más sobre MSDN Blog