Why <%= %> works in one situation but not in another
This is stemming from a bad answer I gave last night. The curiosity as to why one method works and not the other is bugging me and I'm hoping someone smarter than me can give me the proper explanation (or point me to the documentation) of why the following behavior is as it is.
Given the following code-behind:
protected string Ge开发者_运维百科tMyText(string input)
{
return "Hello " + HttpUtility.HtmlEncode(input);
}
Why does this work
<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label>
but this does not
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
Edit - added
At the risk of having my original dumb answer downvoted more times, here's the link to the original question, since some of the answers I'm getting now were already covered in that question.
Why can't I set the asp:Label Text property by calling a method in the aspx file?
Using <%= %>
is equal to putting Response.Write("")
in your page. When doing this:
<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label>
The ASP.NET processor evaluates the control, then when rendering, it outputs the control's contents & calls Response.Write
where it sees <%=
.
In this example:
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
You can't use Response.Write("")
on a Text attribute because it does not return a string. It writes its output to the response buffer and returns void.
If you want to use the server tag syntax in ASP.NET markup you need to use <%# %>
. This combination of markup data binds the value in the tags. To make this work, you'll then need to call DataBind()
in your page's Load()
method for it to work.
Because they are both server side instructions - the second piece of code is equivalent to:
<asp:Label ID="Label1" runat="server" Text='Response.Write(GetMyText("LabelText"))' />
<%= GetMyText("LabelText") %> basically means
Response.Write(GetMyText("LabelText"));
Here it is OK. <%= GetMyText("LabelText") %>
However when you use this:
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
It basically means:
Label1.Text = Response.Write(GetMyText("LabelText"));
which is a wrong statement.
Wrong format:
<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' />
Right format with using resources:
<asp:Label ID="Label1" runat="server" Text='<%$ Resources:Resource, MyText %' />
For it to work in the second case, you'd want it as follows:
<asp:Label ID="Label1" runat="server" Text="<%# GetMyText("LabelText") %>" />
And then Label1 will need to be databound.
Do this on server controls, if you have your LabelText in a Global Resource file:
<asp:Label ID="Label1" runat="server" Text="<%$ Resources: resourceName, LabelText %>" />
精彩评论