using <%= %> or <%# %> with runat=server in ASP.NET
Asked Answered
H

2

5

I have a web control that looks like this

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

I want to put this webcontrol in my aspx page like so:

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

(obviously this code is simplified to show the problem)

In my Render method the variable Fa.La.La is not evaluated. It's coming in as the raw text "<%= Fa.La.La %>" How do I evaluate it?

I'm not particular how the variables are passed in. If the variables can be evaluated if they are passed in as <%# ... %>, that works fine. The point is I have some server-side variables I want evaluated before/while my Render() method is called.

The only thing I can think of is to use a regex to grab the contents of <%= ... %> and use reflection or something, but there has to be a more elegant way to do this.

This question is pretty similar to using server variables in a href <%= xx %> with runat=server, but it's not exactly the same since none of the answers there were useful.

Heraldic answered 13/8, 2012 at 4:11 Comment(1)
Try using this <cc1:Foo Bar='<%= Fa.La.La %>/otherstuff' runat="server" /> NOTE single quote and double quote difference. I hope it may solve the issueIdeography
M
3

You should have to use binding expression <%# expr %>.

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

and call DataBind() method in code-behind.

public void page_load()
{
  DataBind();
}
Minyan answered 13/8, 2012 at 4:21 Comment(1)
To expand on this answer, you can't do something like: Bar="<%# Fa.La.La %>/otherstuff" It just gets rendered literally. The databinding expression has to be the only thing in the attribute, e.g., Bar='<%# String.Concat(Fa.La.La, "/otherstuff") %>' Furthermore, the outside quotes should be single-quotes and the inside quotes should be double-quotes (assuming C#, anyway).Heraldic
Z
6

Well, first you should be clear to diff between both tags. here are some points i have read and used practically..

  • The <%= expressions are evaluated at render time
  • The <%# expressions are evaluated at DataBind() time and are not evaluated at all if DataBind() is not called.
  • <%# expressions can be used as properties in server-side controls.<%= expressions cannot.

read more it on MSDN Blog

Zion answered 13/8, 2012 at 5:1 Comment(0)
M
3

You should have to use binding expression <%# expr %>.

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

and call DataBind() method in code-behind.

public void page_load()
{
  DataBind();
}
Minyan answered 13/8, 2012 at 4:21 Comment(1)
To expand on this answer, you can't do something like: Bar="<%# Fa.La.La %>/otherstuff" It just gets rendered literally. The databinding expression has to be the only thing in the attribute, e.g., Bar='<%# String.Concat(Fa.La.La, "/otherstuff") %>' Furthermore, the outside quotes should be single-quotes and the inside quotes should be double-quotes (assuming C#, anyway).Heraldic

© 2022 - 2024 — McMap. All rights reserved.