在ASP.NET中使用带有runat=server的<%= %>或<%# %>?

5
我有一个类似于这样的Web控件:
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); } }
我想像下面这样在aspx页面中使用这个web控件:
<cc1:Foo Bar="<%= Fa.La.La %>/otherstuff" runat="server" />
(显然,这段代码是为了展示问题而简化的。)
在我的Render方法中,变量Fa.La.La没有被求值。它作为原始文本"<%= Fa.La.La %>"传递进来。如何评估它?
我不介意变量以什么方式传递。如果变量可以通过<%#...%>进行传递并能够被求值,那么就可以正常工作。关键是我想在调用Render()方法之前/同时对一些服务器端变量进行求值。
我唯一能想到的办法是使用正则表达式提取<%=...%>的内容,然后使用反射等方法对其进行处理,但肯定有更优雅的做法。
这个问题与在runat=server中使用<%=xx%>的server变量非常相似,但并不完全相同,因为那里的任何答案都没有用。

尝试使用此代码:<cc1:Foo Bar='<%= Fa.La.La %>/otherstuff' runat="server" /> 注意单引号和双引号的区别。希望能解决问题。 - Moons
2个回答

6

首先,您应该清楚区分这两个标记。

  • <%=表达式在渲染时进行评估。
  • <%#表达式在DataBind()时间进行评估,如果未调用DataBind(),则根本不会进行评估。
  • <%#表达式可用作服务器控件的属性。<%=表达式则不能。

更多信息请参见MSDN博客


3
你应该使用绑定表达式 <%# expr %>
<cc1:Foo Bar='<%# String.Concat(Fa.La.La,"/otherstuff")%>' runat="server" /> 

在代码后台调用DataBind()方法。

public void page_load()
{
  DataBind();
}

2
为了进一步解释这个答案,你不能像这样做: Bar="<%# Fa.La.La %>/otherstuff" 它只会被字面呈现。 数据绑定表达式必须是属性中唯一的内容,例如, Bar='<%# String.Concat(Fa.La.La, "/otherstuff") %>' 此外,外部引号应该是单引号,内部引号应该是双引号(无论是哪种C#)。 - mhenry1384

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接