Проблема встроенного выражения ASP.net - PullRequest
9 голосов
/ 18 февраля 2009

Я не могу понять, почему это не работает ниже. Мне нужно привязать текстовое поле к значению из встроенного выражения. Похоже, простая вещь, верно? Но ни одна из этих работ. Есть идеи? Заранее спасибо.

<asp:textbox id="tbName" runat="server" Text='<%# Eval("test") %>' />
<asp:textbox id="tbName" runat="server" Text='<%= "test" %>' />

Edit: Я должен отметить, что эта страница не имеет кода позади и только следующие директивы вверху.

<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Web" %>
<%@ Page Language="C#" %>

Edit:

Единственное работоспособное решение, которое я мог бы предложить, за исключением добавления кода, - это добавление встроенного серверного скрипта, такого как этот. Хотелось бы знать, почему встроенные выражения не будут работать, если вы не находитесь в контексте привязки данных.

<script language="C#" runat="server"> 
   private void Page_Load(object sender, System.EventArgs e)
    {
      tbName.Text = "test";
    }
</script>

Ответы [ 6 ]

15 голосов
/ 18 февраля 2009

В Page_Load вам придется позвонить в Page.DataBind () для

<asp:textbox id="tbName" runat="server" Text='<%# Eval("test") %>' />

на работу.

<% =%> является сокращенным ответом .Write () и никогда не является допустимым в качестве атрибута для любого тега сервера.

<% #%> можно использовать, только если конкатайнер привязан к базе данных (страница в вашем случае).

<% $%> можно использовать для доступа к данным в файлах ресурсов.

РЕДАКТИРОВАТЬ: Вы также можете взглянуть на Как «связать» свойство Text метки в разметке , что является похожим вопросом.

5 голосов
/ 18 февраля 2009

Как уже говорилось, <% =%> недопустимо в любом месте объявления управления сервером, за исключением случаев, когда внутренняя разметка анализируется как содержимое (например, в повторителе).

<% #%> допустимо в качестве выражения для свойств элемента управления, так как эти выражения будут оцениваться при вызове DataBind () для элемента управления.

Хотя использование Eval () выглядит немного подозрительно. В соответствии с примером Eval () будет использовать текущий объект Page в качестве связующего контекста, что означает, что значение открытого свойства с именем «test» будет связано с вызовом DataBind (). Если у вас на самом деле не определено это свойство в классе Page, выражение никогда ни к чему не приведет.

Eval () в основном предназначен для использования в выражениях внутри элементов управления, таких как Repeater, GridView, ListView и т. Д., Где есть список элементов данных, связанных с помощью шаблонов, и вам нужен метод, чтобы иметь возможность доступа к свойствам текущего элемента данных.

Для всех других элементов управления просто используйте нормальные выражения кода внутри выражения привязки данных - это намного быстрее и более интуитивно понятно, чем Eval (), который основан на отражении во время выполнения.

Если вам нужна более умная альтернатива, использующая синтаксис <% $%>, которая вообще исключает привязку данных, перейдите сюда:

http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx

4 голосов
/ 02 марта 2013

Использование <asp:textbox id="tbName" runat="server" Text='<%# Eval("test") %>' />

и установите tbName.DataBind(); в событии загрузки страницы.

Для тех, кто ищет дополнительную информацию о встроенных выражениях, обратитесь к следующим ссылкам.

ASP.net имеет следующие встроенные выражения

2 голосов
/ 18 февраля 2009

Возможно, вам понадобится пространство имен для элемента управления textbox

<%@ Import "System.Web.UI.WebControls" %>
2 голосов
/ 18 февраля 2009

Попробуйте добавить runat = "server" к элементам сервера. В противном случае этот элемент не будет обработан на сервере.

РЕДАКТИРОВАТЬ: На самом деле, «это правильно», что это не работает; код <% = ...%> не может быть оценен в теге сервера, только выражения, как например <% $ Resources: h1%>

1 голос
/ 18 февраля 2009
<asp:textbox id="tbName" runat="server"><%="test"%></asp:textbox>
...