18

Anscheinend ist es möglich, formatierte Ausgabe mit dem <%= %> Konstrukt (Renderblock) in ASP.NET Web Forms Seiten und Ansichten zu schreiben.Wo ist diese ASP.NET-Funktion dokumentiert? <% = string format, params object [] args%>

<%= "{0} is {1}", "Foo", 42 %> 

Dies wird "Foo ist 42". Soweit ich weiß, übersetzt der ASP.NET-Parser <%= %> in einen Anruf an HttpResponse.Write(string). Offensichtlich gibt es im obigen Code keine Eins-zu-Eins-Übersetzung, weil die Anzahl der Argumente nicht übereinstimmt (vorausgesetzt, dass , im obigen Ausdruck Argumente trennt).

Jetzt habe ich gesehen, dass die Klasse TextWriter eine Write(string, object[]) Methode hat.

Ich habe die Ausgabe von dem Parser überprüft, und in der Tat nennt es die TextWriter ‚s Methode, die ein params object[] Argument für die Formatierung übernimmt:

private void @__Renderform1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) { 
    // ... 
    @__w.Write("{0} is {1}", "Foo", 42); 

Ist das Verhalten überall dokumentiert?

+7

+1 für mich etwas neues beizubringen. – Heinzi

+3

@Heinzi Das erste Mal, dass ich es sah, dachte ich, es muss ein Bug sein, auch weil ReSharper es mit einer Warnung markiert hat "Methode '__ReSharper_Render' hat 1 Parameter, wird aber mit 3 Argument (en) aufgerufen" Ausdruck erwartet ". –

+0

Dies ist nur klassische M $ FT.Ich habe 13 Jahre lang Anwendungen auf ihrem Stack gebaut und solche Sachen scheinen immer wieder aufzutauchen. Ich muss sagen, in der Open-Source-Community sieht man so etwas fast nirgendwo dokumentiert. Es kann schwierig sein, zu navigieren, weil Sie nie wissen, welche Bibliothek zu verwenden ist, aber sie sind dokumentiert. –

Antwort

3

Soweit ich die ASP.NET-Parser weiß <% =%> übersetzt in ein Anruf an HttpResponse.Write (string).

Vielleicht ist die <%= "{0} is {1}", "Foo", 42 %>-Response.Output.Write(string format, params object[] arg) übersetzt, Output Wesen vom Typ TextWriter, die die Erklärung nach http://www.hanselman.com/blog/ASPNETResponseWriteAndResponseOutputWriteKnowTheDifference.aspx

+0

Ich habe meine Frage mit der Ausgabe vom Parser bearbeitet. Es ruft direkt in 'HtmlTextWriter.Write (string format, params object [] args)' auf. –

+0

@michielvoo Ich habe es mir auch angeschaut. <%="Foo"%> wird gleich konvertiert, während <% Response.Write ("Foo")%> in base.Response.Write ("Foo") konvertiert wird. Ich denke @__w ist die Response.Output. Ich muss einen Weg finden, um zu überprüfen ;-) – jbl

+0

Was ich getan habe, war eine einfache ASPX-Seite mit dem Render-Block zu erstellen, debug auf True in web.config, verursachen einen Kompilierungsfehler irgendwo in der ASPX-Seite, und fordern Sie dann die Seite. Auf der Fehlerseite gibt es eine Option zum Anzeigen der Kompilierungsquelle, die den vom Parser generierten Code anzeigt. –

3

Dies ist ein <%= %>embedded code block und existiert die Kompatibilität mit klassischen ASP wäre.

Wie man sehen konnte <%= "{0} is {1}", "Foo", 42 %> entspricht:

string s = string.Format("{0} is {1}", "Foo", 42); 
Response.Write(s); 

Das Verhalten here dokumentiert ist:

Schreibt eine formatierte Zeichenfolge, die die Textdarstellung eines Objektarray mit dem Ausgangsstrom enthält, zusammen mit allen ausstehenden Tabstopps. Diese Methode verwendet dieselbe Semantik wie die String.Format-Methode. (Überschreibungen TextWriter.Write (String, Object []).)

Here ist, wo es ist dokumentiert, dass der Kodex Render-Block die Write-Methode aufruft.

Schließlich wurde die Syntax für eingebettete Codebausteine ​​für .NET 4 wie beschrieben here aktualisiert.

+0

+1 für alle Dokumentationsverknüpfungen - aber keine davon speziell Geben Sie an, dass Sie eine ** implizierte ** Syntax in einem eingebetteten Codeblock verwenden können. –

+1

+1 Ich habe das Zitat umformatiert – xanatos

+0

Über welche implizite Syntax sprichst du? String.Format nimmt eine variable Anzahl von Argumenten. – dcaswell