13 Stimmen

Wie verwendet man die C#-Konstante auf der ASP.Net-Seite?

Die nachstehenden Beispiele machen vielleicht wenig Sinn, aber das liegt daran, dass ich mich auf die Syntax konzentriere.

Nehmen wir an, ich habe solchen C#-Code:

public static class Foo
{
  public const string Bar = "hello world.";
}

Nun würde ich gerne die Konstante Foo.Bar in ASP.Net verwenden, anstatt jedes Mal "Hallo Welt" einzugeben. Also habe ich diese Syntax verwendet:

<p><%= Foo.Bar %></p>

Es funktioniert. Es funktioniert auch in solchen Fällen:

<p>"<%= Foo.Bar %>"</p>

<p class="<%= Foo.Bar %>">the weird, nonsense example</p>  

Es funktioniert also auch mit Zitaten. Allerdings habe ich auch Fälle, in denen Angebote höhere Priorität erhalten:

<custom:Header runat='server' Text="<%= Foo.Bar %>"/>

(Kopfzeile ist ein benutzerdefiniertes Steuerelement - es fügt einfach einige CSS standardmäßig und Position). In diesem Fall haben Anführungszeichen eine höhere Priorität und der gesamte Text wird so gesaugt, wie er ist, d.h. ich erhalte eine Kopfzeile mit Text

<%= Foo.Bar %>

Also, meine Frage ist. Was ist die Syntax, um den Wert der C#-Konstante zu erhalten, egal was (IOW -- mit höchster Priorität)?

Bearbeitungen:

<custom:Header runat='server' Text="<%# Foo.Bar %>"/>

(beachten Sie die Raute anstelle des Gleichheitszeichens) funktioniert nicht so gut.

2voto

elsni Punkte 1833

Versuchen Sie zu vermeiden, c#-Code außer im Code dahinter zu haben. Legen Sie besser ein Label-Steuerelement in der Aspx-Seite und setzen Sie seine Text-Eigenschaft mit Foo.Bar

myLabel.Text = Foo.Bar;

Sie haben dann den gesamten serverseitigen Code im Code dahinter, er ist viel sauberer und für andere lesbar.

0 Stimmen

Vielen Dank, es funktioniert gut, aber ich ziehe es vor, Symbole in ASP zu setzen, weil der Code viel kürzer ist, und es gibt viele Fälle, in denen ich keine Id für Widgets festlegen muss. Mit Ihrem Ansatz würde ich dies tun müssen. Wie auch immer, ich danke Ihnen, dass Sie dies mit uns teilen - es ist besser, eine Entscheidung zu treffen, wenn man weiß, welche Optionen es gibt.

0 Stimmen

Das ist agil :-) Vielen Dank auch dafür, dass Sie die Meinung anderer Leute respektieren!

2voto

Wallace Breza Punkte 4828

Sie können Datenbindungsausdrücke in Ihrer Seite verwenden, solange die Seite databound ist. Sie können Ihr Beispiel trotzdem verwenden:

<custom:Header runat='server' Text="<%# Foo.Bar %>"/>

Sie müssen aber auch sicherstellen, dass Sie die DataBind() in Ihrem Code, um alle Ausdrücke in Ihrer Seite, die sich außerhalb eines Datenbindungssteuerelements befinden, zu binden.

protected void Page_Load(object sender, EventArgs e)
{
    DataBind();
}

0 Stimmen

Vielen Dank, ich habe dies hinzugefügt, aber die Texteigenschaft erhält immer noch das wörtliche Zitat anstelle von "hello world".

0 Stimmen

Sie erhalten ein zusätzliches Angebot? Alles, was dies tun sollte, ist den Wert Ihrer Konstante an die Texteigenschaft Ihres benutzerdefinierten Steuerelements zu binden. Ich habe den Code für Ihr benutzerdefiniertes Steuerelement nicht, aber wenn ich dies mit einem einfachen <asp:Label /> Steuerung funktioniert es gut.

0 Stimmen

Nein, ich erhalte genau das, was ich eingegeben habe, also die Ausgabe ist: <%# Foo.Bar %>. Oder anders ausgedrückt: Der eingegebene Text wird wie ein normaler Text behandelt.

1voto

Für ein benutzerdefiniertes Steuerelement funktioniert dies wie oben beschrieben, solange Ihr Steuerelement die DataBind() intern (zum Beispiel in WebControl.Render , usw.)

0voto

Danil Punkte 1833

Sie müssen den Namespace in Ihre asp.net-Seite importieren <% import namespace="namespace.of.foo.class" %>

Ups, tut mir leid, Sie können die <%=-Syntax nicht in Server-Steuerelementen verwenden. Im Falle von Server-Steuerelementen müssen Sie es im Code zuweisen. Und es spielt keine Rolle, ob es sich um eine Konstante oder eine Eigenschaft Ihrer Seitenklasse handelt.

0 Stimmen

Sie ist wirklich auf <%= ? Weil <%# für Server-Steuerelemente funktioniert, ist es seltsam. Immerhin könnte ich einfach Funktion GetThis schreiben, und dann schreiben <%# GetThis(Foo.Bar) %>

0voto

eglasius Punkte 35447

Afaik wird der Wert in <%= während der Rendering-Phase des Lebenszyklus der Seite verwendet

die Steuerelemente benötigen diese Werte früher im Lebenszyklus. Die Verwendung von <%# wird während der Datenbindung erfolgen.

Eine andere Möglichkeit ist, es einfach auf Page_Load zu setzen. Das ist die Art und Weise, wie es in normalem Asp.net verwendet werden soll. Alternativ können Sie es sogar früher / während init (tun, wenn Sie es nicht manipulieren) setzen.

0 Stimmen

Ich benutze Page_Load jetzt dank Elsni, aber ich würde gerne wissen, wie man es in ASP zu tun, <%# hat auch Priorität nicht ausreichend genug, um den Wert der es zu lösen.

0 Stimmen

Erhalten Sie das gleiche Verhalten? Sie sollten leer sein, wenn Sie nicht tatsächlich DataBind auf diesem Steuerelement aufrufen.

0 Stimmen

Ich bekomme den Text, er ist nicht leer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X