Подтвердить что ты не робот

Сообщение об ошибках веб-форм: "Это не скриптлет. Будет выводиться как обычный текст"

В моих веб-формах ASP.NET у меня есть следующий декларативный код:

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

Компилятор редактирования времени, однако, предупреждает меня, что "это не скриптлет [sic]. Будет выводиться как обычный текст". Верный своему слову, класс css отображается как буквально "<% = TEXTBOX_CSS_CLASS% > ".

Что означает это сообщение об ошибке и есть ли обходной путь, поэтому я все еще могу использовать константу в базовом классе?

4b9b3361

Ответ 1

Вы не можете использовать <%= ... %> для установки свойств элементов управления на стороне сервера. Встроенные выражения <% %> могут использоваться только в aspx page или пользовательский уровень верхнего уровня документа, но не может быть внедрен в атрибут тега управления сервером (например, <asp:Button... Text =<% %> ..>).

Если ваш TextBox находится внутри элементов управления DataBound, таких как GridView, ListView, вы можете использовать синтаксис <%# %>. ИЛИ вы можете явно вызывать DataBind() на элементе управления с помощью кода или встроенного сервера script.

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

//code За файлом

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

ASP.NET включает в себя несколько встроенных построителей выражений, которые позволяют извлекать пользовательские настройки приложения и информацию о строках соединения из файла web.config. Пример:

  • Ресурсы
  • ConnectionStrings
  • AppSettings

Итак, если вы хотите получить параметр приложения с именем className из <appSettings> части файла web.config, вы можете использовать следующее выражение:

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

Однако выше фрагмент не является стандартом для чтения классных имен из приложений.

Вы можете создавать и использовать свой собственный пользовательский ExpressionBuilders или использовать код позади как:

txtbox.CssClass = TEXTBOX_CSS_CLASS;

Проверьте эту ссылку при создании сборщиков пользовательских выражений. Когда вы создадите собственное выражение, вы можете отобразить значение, например:

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

Ответ 2

Проблема заключается в том, что вы не можете смешивать элементы управления runat=server с блоками кода <%= .. %>. Правильный способ - использовать код позади: txtbox.CssClass = TEXTBOX_CSS_CLASS;.

Ответ 3

Это будет работать.

Отметьте

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

Code-за

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

Но его намного более чистый доступ к свойству CssClass asp:TextBox на Page_Load