在我的ASP .NET Web Forms中,我有以下声明性代码:
<asp:TextBox runat="server" ID="txtbox" CssClass='<%=TEXTBOX_CSS_CLASS%>' />
常量TEXTBOX_CSS_CLASS在页面的代码隐藏类继承自的基类中定义:
public class MyPageBase : Page
{
protected internal const string TEXTBOX_CSS_CLASS = "myClass";
}
然而,编辑时编译器警告我"这不是脚本[原文如此]。将输出为纯文本"。正如它所说,css 类的字面意思是"<%=TEXTBOX_CSS_CLASS%>"。
此错误消息是什么意思,是否有解决方法,以便我仍然可以在基类中使用常量?
不能使用 <%= ... %>
来设置服务器端控件的属性。内联表达式<% %>
只能在ASPX 页或用户控件的顶级文档级别,但不能嵌入到服务器控件的标记属性(如 <asp:Button... Text =<% %> ..>
(。
如果 TextBox 位于 DataBound 控件(如 GridView、ListView(中,则可以使用: <%# %>
语法。或者,可以从代码隐藏或内联服务器脚本显式调用控件上的DataBind()
。
<asp:TextBox runat="server" ID="txtbox" class='<%# TEXTBOX_CSS_CLASS %>' />
代码 文件后面
protected void Page_Load(object sender, EventArgs e)
{
txtbox.DataBind();
}
ASP.NET 包括一些内置表达式生成器,可用于从web.config
文件中提取自定义应用程序设置和连接字符串信息。例:
- 资源
- 连接字符串
- 应用设置
因此,如果要从web.config
文件的<appSettings>
部分中检索名为 className
的应用程序设置,可以使用以下表达式:
<asp:TextBox runat="server" Text="<%$ AppSettings:className %>" />
但是,上面的代码段不是从应用设置中读取类名的标准。
您可以构建和使用自己的自定义ExpressionBuilders
或使用代码隐藏作为:
txtbox.CssClass = TEXTBOX_CSS_CLASS;
查看有关生成自定义表达式生成器的链接。构建自定义表达式后,可以显示如下值:
<asp:TextBox Text="<%$ SetValue:SomeParamName %>"
ID="setting"
runat="server" />
问题是你不能将runat=server
控件与<%= .. %>
代码块混合使用。正确的方法是使用代码隐藏:txtbox.CssClass = TEXTBOX_CSS_CLASS;
。
这将起作用。
标记
<asp:TextBox runat="server" ID="txtbox" class='<%# TEXTBOX_CSS_CLASS %>' />
代码隐藏
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
txtbox.DataBind();
}
}
但是在Page_Load
上访问asp:TextBox
的CssClass
属性要干净得多