Почему <% =%> работает в одной ситуации, но не в другой
Это связано с плохим ответом, который я дал вчера вечером. Любопытство в отношении того, почему работает один метод, а не другой, подталкивает меня, и я надеюсь, что кто-то умнее меня может дать мне правильное объяснение (или указать мне на документацию), почему следующее поведение такое, как есть.
Учитывая следующий код:
protected string GetMyText(string input)
{
return "Hello " + HttpUtility.HtmlEncode(input);
}
Почему это работает
<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label>
, но это не
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
Изменить - добавлено
Рискуя, что мой первоначальный тупой ответ будет подавлен больше времени, здесь ссылка на исходный вопрос, так как некоторые ответы, которые я получаю сейчас, уже были освещены в этом вопросе.
Почему я не могу установить свойство asp: Label Text, вызвав метод в файле aspx?
Ответы
Ответ 1
Использование <%= %>
равно помещению Response.Write("")
на вашу страницу. При этом:
<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label>
Процессор ASP.NET оценивает элемент управления, затем при рендеринге выводит содержимое элемента управления и вызывает Response.Write
, где он видит <%=
.
В этом примере:
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
Вы не можете использовать Response.Write("")
в атрибуте Text, потому что он не возвращает строку. Он записывает свой вывод в буфер ответа и возвращает void.
Если вы хотите использовать синтаксис тегов сервера в разметке ASP.NET, вам нужно использовать <%# %>
. Эта комбинация данных разметки связывает значение в тегах. Чтобы выполнить эту работу, вам нужно будет вызвать DataBind()
в вашей странице Load()
, чтобы она работала.
Ответ 2
Поскольку они являются инструкциями на стороне сервера, вторая часть кода эквивалентна:
<asp:Label ID="Label1" runat="server" Text='Response.Write(GetMyText("LabelText"))' />
Ответ 3
<% = GetMyText ( "LabelText" )% > в основном означает
Response.Write(GetMyText ( "LabelText" ));
Здесь все в порядке. <% = GetMyText ( "LabelText" )% >
Однако, когда вы используете это:
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
В основном это означает:
Label1.Text = Response.Write(GetMyText ( "LabelText" ));
что является неправильным утверждением.
Ответ 4
Неверный формат:
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
Правый формат с использованием ресурсов:
<asp:Label ID="Label1" runat="server" Text='<%$ Resources:Resource, MyText %' />
Ответ 5
Сделайте это на серверах, если у вас есть LabelText в файле Global Resource:
<asp:Label ID="Label1" runat="server" Text="<%$ Resources: resourceName, LabelText %>" />
Ответ 6
Чтобы он работал во втором случае, вам нужно его следующее:
<asp:Label ID="Label1" runat="server" Text="<%# GetMyText("LabelText") %>" />
И тогда Label1 необходимо будет привязать к базе данных.