Web Forms error message: “This is not scriptlet. Will be output as plain text”

In my ASP .NET Web Forms I have the following declarative code:

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

The constant TEXTBOX_CSS_CLASS is defined in a base class that the page’s code-behind class inherits from:

public class MyPageBase : Page
{
    protected internal const string TEXTBOX_CSS_CLASS = "myClass";
}

The edit-time compiler however warns me that “This is not scriptlet [sic]. Will output as plain text”.
True to its word, the css class is rendered as literally “<%=TEXTBOX_CSS_CLASS%>”.

What does this error message mean and is there a workaround so I can still use a constant in a base class?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You cannot use <%= ... %> to set properties of server-side controls.
Inline expressions <% %> can only be used at
aspx page or user control’s top document level, but can not be embeded in
server control’s tag attribute (such as <asp:Button... Text =<% %> ..>).

If your TextBox is inside a DataBound controls such as GridView, ListView .. you can use: <%# %> syntax. OR you can call explicitly DataBind() on the control from code-behind or inline server script.

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

// code Behind file

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

ASP.NET includes few built-in expression builders that allows you to extract custom application settings and connection string information from the web.config file. Example:

  • Resources
  • ConnectionStrings
  • AppSettings

So, if you want to retrieve an application setting named className from the <appSettings> portion of the web.config file, you can use the following expression:

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

However, above snippet isn’t a standard for reading classnames from Appsettings.

You can build and use either your own Custom ExpressionBuilders or Use code behind as:

txtbox.CssClass = TEXTBOX_CSS_CLASS;

Check this link on building Custom Expression builders.
Once you build your custom Expression you can display value like:

<asp:TextBox Text="<%$ SetValue:SomeParamName %>"
    ID="setting" 
    runat="server" />

Method 2

The problem is that you can’t mix runat=server controls with <%= .. %>code blocks. The correct way would be to use code behind: txtbox.CssClass = TEXTBOX_CSS_CLASS;.

Method 3

This will work.

Mark up

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

Code-behind

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

But its a lot cleaner to access the CssClass property of the asp:TextBox on Page_Load


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x