我有一个看起来像这样的网页控件
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非常相似,但它并不完全相同,因为没有一个答案是有用的。
答案 0 :(得分:6)
嗯,首先你应该清楚两个标签之间的区别。 这里有几点我已经阅读并实际使用过..
<%=
表达式在渲染时评估<%#
表达式在DataBind()
时进行评估,如果完全没有评估
不调用DataBind()。 <%#
表达式可用作属性
在服务器端控件中。<%=
表达式不能。答案 1 :(得分:3)
您必须使用绑定表达式<%# expr %>
。
<cc1:Foo Bar='<%# String.Concat(Fa.La.La,"/otherstuff")%>' runat="server" />
并在代码隐藏中调用DataBind()
方法。
public void page_load()
{
DataBind();
}