2009-10-07 12 views
16

Wynika to ze złej odpowiedzi, którą dałem ostatniej nocy. Ciekawość, dlaczego jedna metoda działa, a nie druga, podsłuchuje mnie i mam nadzieję, że ktoś mądrzejszy ode mnie może dać mi odpowiednie wyjaśnienie (lub wskazać mi w dokumentacji), dlaczego następujące zachowanie jest takie, jakie jest.Dlaczego <%= %> działa w jednej sytuacji, ale nie w innej

Biorąc pod uwagę następujący kod z opóźnieniem:

protected string GetMyText(string input) 
{ 
    return "Hello " + HttpUtility.HtmlEncode(input); 
} 

Dlaczego to działa

<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label> 

ale to nie

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

Edycja - dodał

Ryzykując, że moja oryginalna głupia odpowiedź będzie więcej razy przewracana, tutaj znajduje się link do pierwotnego pytania, ponieważ niektóre z odpowiedzi, które otrzymuję, zostały już omówione w tym pytaniu.

Why can't I set the asp:Label Text property by calling a method in the aspx file?

+0

Czy ma coś z pojedynczym a podwójnym cudzysłowem? Wiem, że niektóre języki sprawiają, że wszystko wewnątrz pojedynczego cudzysłowu jest czystym wyjściem, podczas gdy tekst wewnątrz podwójnego cudzysłowu jest oceniany jako pierwszy ... – peirix

+2

@peirix - Pojedyncze i podwójne cudzysłowy nie mają znaczenia dla składni ASP.NET. Składnia jest zgodna z regułami składni XML, które mówią, że możesz używać cudzysłowów podwójnych i pojedynczych zamiennie, o ile zawsze kończysz z tym samym, od którego zaczynałeś. –

Odpowiedz

42

Korzystanie <%= %> jest równa oddanie Response.Write("") na swojej stronie. Gdy w ten sposób:

<asp:Label ID="Label1" runat="server"><%= GetMyText("LabelText") %></asp:Label> 

Procesor ASP.NET ocenia kontrolę, a następnie przy renderowaniu, wyprowadza zawartość formantu & nazywa Response.Write gdzie widzi <%=.

W tym przykładzie:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

Nie można używać Response.Write("") na atrybut tekstu, ponieważ nie zwraca ciąg znaków. Zapisuje swój wynik do bufora odpowiedzi i zwraca nieważne.

Jeśli chcesz użyć składni znaczników serwera w znacznikach ASP.NET, musisz użyć <%# %>. Ta kombinacja danych znaczników wiąże wartość w tagach. Aby to zadziałało, musisz zadzwonić pod numer DataBind() w swojej metodzie strony Load(), aby działało.

+0

+1 Tak, za pomocą odpowiedzi.W tekście wewnątrz właściwości tekstu nie ma sensu. – RichardOD

+1

Aby rozwinąć w instrukcji '<%# %>' zostanie wypełnione po powiązaniu danych. Oznacza to, że nic się nie stanie, dopóki '' DataBind() 'nie zostanie wywołany w kontrolce lub jej kontenerze. Możliwe jest wywoływanie 'PageDataBind()' w zdarzeniu 'OnLoad' (tak jak powiedział Dan), jeśli nic innego nie powoduje powiązania danych na kontrolerze, ale nie jest to konieczne, jeśli kontrola jest już databoundem. – Blixt

+0

Po raz pierwszy widziałem konstrukcję <%= %> i jej wyjaśnienie. Czy ktoś wie o dobrym źródle, aby szczegółowo wyjaśnić wszystkie konstrukcje, co robią i kiedy ich używać? –

2

Niepoprawny format:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

odpowiedni format z wykorzystaniem zasobów:

<asp:Label ID="Label1" runat="server" Text='<%$ Resources:Resource, MyText %' /> 
4

Ponieważ są obie instrukcje po stronie serwera - drugi kawałek kodu jest równoważne:

<asp:Label ID="Label1" runat="server" Text='Response.Write(GetMyText("LabelText"))' /> 
1

Czyńcie to na kontroli serwera, jeśli masz tekstetykiety w pliku globalnego zasobu:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources: resourceName, LabelText %>" /> 
4

<% = GetMyText ("LabelText")%> w zasadzie oznacza

Odpowiedź.Write (GetMyText ("LabelText"));

Tutaj jest OK. <% = GetMyText ("tekstetykiety")%>

Jednak podczas korzystania z tego:

<asp:Label ID="Label1" runat="server" Text='<%= GetMyText("LabelText") %>' /> 

To w zasadzie oznacza:

Label1.Text = Response.Write (GetMyText ("tekstetykiety"));

co jest błędnym stwierdzeniem.

1

go do pracy w drugim przypadku, że chcesz go w następujący sposób:

<asp:Label ID="Label1" runat="server" Text="<%# GetMyText("LabelText") %>" /> 

A potem Label1 będą musiały być z danymi.

Powiązane problemy