使用<%=%>或<%#%>在ASP.NET中使用runat = server

时间:2012-08-13 04:11:07

标签: asp.net asp.net-webcontrol

我有一个看起来像这样的网页控件

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

我想把这个webcontrol放在我的aspx页面中,如下所示:

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

(显然,此代码已经过简化以显示问题)

在我的Render方法中,不评估变量Fa.La.La。它以原始文本“&lt;%= Fa.La.La%&gt;”进入我该如何评估它?

我并不特别传递变量的方式。如果变量可以通过&lt;%#...%&gt;传入来进行评估,那就可以了。关键是我有一些服务器端变量,我想在调用我的Render()方法之前进行评估。

我唯一能想到的是使用正则表达式来获取&lt;%= ...%&gt;的内容并使用反射或其他东西,但必须有一个更优雅的方式来做到这一点。

这个问题与using server variables in a href <%= xx %> with runat=server非常相似,但它并不完全相同,因为没有一个答案是有用的。

2 个答案:

答案 0 :(得分:6)

嗯,首先你应该清楚两个标签之间的区别。 这里有几点我已经阅读并实际使用过..

  • <%=表达式在渲染时评估
  • <%#表达式在DataBind()时进行评估,如果完全没有评估 不调用DataBind()。
  • <%#表达式可用作属性 在服务器端控件中。<%=表达式不能。

MSDN Blog

上阅读更多内容

答案 1 :(得分:3)

您必须使用绑定表达式<%# expr %>

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

并在代码隐藏中调用DataBind()方法。

public void page_load()
{
  DataBind();
}