5

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

公共类 Foo : WebControl
{
  [可绑定(真)]
  [类别(“默认”)]
  [默认值(””)]
  [可本地化(真)]
  公共字符串栏 { 获取;放; }

  受保护的覆盖无效渲染(HtmlTextWriter 输出)
  {
    output.WriteLine(Bar);
  }
}

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

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

(显然这段代码被简化以显示问题)

在我的 Render 方法中,变量 Fa.La.La 没有被评估。它以原始文本“<%= Fa.La.La %>”的形式出现我如何评估它?

我并不特别说明变量是如何传入的。如果变量以 <%# ... %> 的形式传入,则可以对其进行评估,那可以正常工作。关键是我有一些服务器端变量要在调用 Render() 方法之前/期间进行评估。

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

这个问题与在带有 runat=server 的 href <%= xx %> 中使用服务器变量非常相似,但并不完全相同,因为那里的答案都没有用。

4

2 回答 2

6

好吧,首先你应该清楚区分两个标签。这是我读过并实际使用过的一些要点。

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

在MSDN 博客上阅读更多内容

于 2012-08-13T05:01:32.330 回答
3

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

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

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

public void page_load()
{
  DataBind();
}
于 2012-08-13T04:21:02.260 回答