27

在我的 ASP .NET Web 窗体中,我有以下声明性代码:

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

然而,编辑时编译器警告我“这不是 scriptlet [原文如此]。将输出为纯文本”。诚如其言,css 类按字面意思呈现为“<%=TEXTBOX_CSS_CLASS%>”。

此错误消息是什么意思,是否有解决方法,以便我仍然可以在基类中使用常量?

4

3 回答 3

32

您不能用于<%= ... %>设置服务器端控件的属性。内联表达式<% %>只能用于 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文件中提取自定义应用程序设置和连接字符串信息。例子:

  • 资源
  • 连接字符串
  • 应用设置

因此,如果要检索className从文件<appSettings>部分命名的应用程序设置web.config,可以使用以下表达式:

<asp:TextBox runat="server" Text="<%$ AppSettings:className %>" /> 

但是,上面的代码片段并不是从 Appsettings 中读取类名的标准。

您可以构建和使用您自己的自定义ExpressionBuilders或使用后面的代码:

txtbox.CssClass = TEXTBOX_CSS_CLASS;

检查有关构建自定义表达式构建器的此链接。构建自定义表达式后,您可以显示如下值:

<asp:TextBox Text="<%$ SetValue:SomeParamName %>"
    ID="setting" 
    runat="server" />
于 2013-09-23T07:08:58.550 回答
16

问题是您不能将runat=server控件与<%= .. %>代码块混合使用。正确的方法是使用后面的代码:txtbox.CssClass = TEXTBOX_CSS_CLASS;.

于 2013-09-23T06:57:46.007 回答
9

这将起作用。

标记

<asp:TextBox runat="server" ID="txtbox" class='<%# TEXTBOX_CSS_CLASS %>' />

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        txtbox.DataBind();
    }
}

但是访问on的CssClass属性要干净得多asp:TextBoxPage_Load

于 2013-09-23T07:04:41.950 回答