Warum führen <% =%> Ausdrücke als Eigenschaftswerte auf einem Server zu Kompilierungsfehlern?

Diese Frage ist das Ergebnis dessen, was mir bei dem Versuch aufgefallen ist, @ zu beantworteeine andere Frag. Und jetzt bin ich gespannt, warum<asp:TextBox runat="server" Visible="<%= true %>" /> führt zu einem Kompilierungsfehler und nicht zu einer sichtbaren TextBox, wie ich es erwartet hätte.

Von dem, was ich bisher entdeckt habe, das<%= %> Ausdrücke werden nicht in wörtliche Steuerelemente übersetzt, wie ich immer gedacht habe. Stattdessen wird es ausgewertet und beim Rendern der Seite direkt in den HtmlTextWriter geschrieben. Aber anscheinend versucht der Parser (ich bin mir nicht sicher, ob dies der richtige Begriff für den Teil ist, der ASP.NET-Markup in .NET-Code übersetzt) nicht einmal, @ auszuwerte<%= %> Ausdrücke, wenn sie als Eigenschaftswerte für Serversteuerelemente verwendet werden. Es wird nur als Zeichenfolge verwendet. Was ich denke, ist, warum ich die Fehlermeldung bekomme:Kann kein Objekt vom Typ 'System.Boolean' aus der Zeichenfolgendarstellung '<% = true%>' für die Eigenschaft 'Visible' erstellen.

Wenn ich stattdessen den runat = "server" loswurde und das @ kombinie<%= %> mit normalem HTML-Markup, wie folgt:

<input type="button" id="Button1" visible='<%= true %>' />

Dann teilt der Parser den Chunk nur vor und nach dem Ausdruck in Teile und schreibt ihn dann in der Render-Methode in den HtmlTextWriter. Etwas wie das

    __w.Write("<input type=\"button\" id=\"Button1\" visible='");
    __w.Write(true);
    __w.Write("' />");

ls letztes ist mir aufgefallen ... Wenn ich es mit @ versuc<%# %> + Control.DataBind (), dann bekomme ich was ich erwarten würde. Es bindet den Ausdruck ein, der verwendet werden soll, wenn das Steuerelement datengebunden ist. Im Gegensatz zum Ausdruck <% =%> wertet der generierte Code jedoch den Inhalt des @ au<%# %> Ausdruck. Der Parser generiert am Ende Folgendes:

[DebuggerNonUserCode]
private Button __BuildControldataboundButton()
{
    Button button = new Button();
    base.databoundButton = button;
    button.ApplyStyleSheetSkin(this);
    button.ID = "databoundButton";
    button.DataBinding += new EventHandler(this.__DataBindingdataboundButton);
    return button;
}

public void __DataBindingdataboundButton(object sender, EventArgs e)
{
    Button button = (Button) sender;
    Page bindingContainer = (Page) button.BindingContainer;
    button.Visible = true;
}

Von

<asp:Button ID="databoundButton" Visible='<%# true %>' runat="server" />

Notice thebutton.Visible = true; das ist das Ergebnis des<%# %> Ausdruck

Also meine Frage ist .. Warum wird der Ausdruck im ersten Beispiel nur als Zeichenfolge behandelt, anstatt als "wahr" ausgewertet zu werden. Die Ausdrücke sind für die beiden anderen Beispiele etwas ähnlich und ergeben den Code, den ich erwartet hätte.

Ist es nur ein Fehler (was ich bezweifle, da es kein neues Problem mit der aktuellen Version von ASP.NET ist), oder gibt es einen guten Grund, warum wir nicht @ verwenden dürf<%= %> so wie das

Antworten auf die Frage(2)

Ihre Antwort auf die Frage