2011-01-12 13 views
2

Ich bekomme diese Fehlermeldung, wenn ich versuche, meine C# Klasse haben die Haut eines Steuer asp ändern:Kann nicht SkinID Eigenschaft dynamisch ändern

Die ‚SkinID‘ Eigenschaft kann nur in oder vor dem Page_PreInit Ereignis eingestellt werden für statische Kontrollen. Legen Sie für dynamische Steuerelemente die Eigenschaft vor fest und fügen Sie sie der Controls-Auflistung hinzu.

Mein Ziel ist es, eine Platte zur Verfügung zu stellen, rufen Sie es ID = „Antwort“, auf jeder Seite, und dann dynamisch ändert es CSS-Klasse von Fehlern zum Erfolg ist, oder Erfolg auf Fehler (so ist es rot oder grün). Und ich mache es auch sichtbar = wahr, wenn eine Antwort erstellt wird.

Anscheinend bin ich gezwungen, CssClass-Attribut zu verwenden, die die einzige Möglichkeit ist, die dies funktioniert.

Als Neben Wegthema Anmerkung: In PHP, würden Sie nicht ein Problem der Verwendung verschiedener "pre-init" haben "post-init" etc. Ein völlig unnötig Prozess. Sie würden einfach den HTML-Code ändern, bevor Sie ihn an den Benutzer zurücksenden. Ich bin ein wenig verwirrt, warum ASP.NET entscheidet, alles zu verkomplizieren. Es ist ein bisschen albern für mich, sich Zeit zu nehmen, um all diese verschiedenen komplizierten Prozesse zu lernen, um einfach eine Webseite anzuzeigen. Es braucht Zeit, um alle Macken zu lernen, die in schwer lesbaren ASP-Lebenszyklusdokumenten auf Microsoft geschrieben sind. Nicht um irgendwelche Leute zu beleidigen, aber es ist einfach nicht praktikabel.

Antwort

3

Wenn es sich um eine statische Kontrolle, das heißt Sie das Panel in Ihrer ASPX-Seite definieren, dann ist der einzige Ort, um die SkinID zu ändern, ist in der PreInit Methode zB:

protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 
    String panelSkin = ViewState("panelSkin").toString(); 
    panel1.SkinId = panelSkin; 
} 

Selbstverständlich ist das PreInit-Methode wird nur aufgerufen, wenn die Seite zuerst initialisiert wird - nicht auf einem PostBack.

Sie können die skinId, die Sie verwenden möchten, in ViewState speichern und dann eine Response.Redirect ("myPage.aspx") aufrufen ...Und wie oben zu sehen, greifen Sie die skinId-Zeichenfolge von ViewState und legen Sie die Panel-skinId entsprechend fest.

Alternativ können Sie anstelle eines Bedienfelds ein UpdatePanel aus der .Net Ajax-Bibliothek verwenden. Wenn Sie auf eine Schaltfläche im UpdatePanel klicken (vorausgesetzt, sie ist so eingerichtet, dass sie ein ASyncPostBack auslöst), wird die OnPreInit-Methode ausgeführt.

Das heißt, vorausgesetzt, Sie ändern den Hintergrund, wäre die Verwendung der CssClass-Eigenschaft der effizienteste Weg, dies zu tun.

1

ASP, und sein Kind ASP.NET, ist im Grunde ein großer Hack von Vanille HTML und der IIS-Seitenrenderer. Es knüpft an verschiedene Phasen des Lebenszyklus an, die in IIS bereits existierten, anstatt einen eigenen Lebenszyklus wie PHP zu haben. Als solche gibt es Dinge, die Sie in bestimmten Bereichen tun können, weil die Dinge, auf die es ankommt, nicht in Stein gemeißelt sind, so dass Sie sie ändern können oder damit Sie mit ihnen arbeiten können. Die große Stärke von ASP.NET, dem Interop mit .NET-Klassen und dem .NET Framework, IMO, gleicht einige seiner Eigenheiten aus.

Wie auch immer, Skins sind Teil von Designs, die früh im Prozess geladen werden, damit die Steuerelemente mit ihren richtigen Standardstilen initialisiert werden können. Das ist der Schlüssel; Das Theme ist nach PreInit gesperrt, aber die Styles (und CssClasses) hinter den Skins können bis einschließlich PreRender editiert werden, einschließlich Event-Handler (die Validierung auslösen). Stellen Sie also den Style oder die CssClass dynamisch ein.

Um es ohne ein vollständiges Postback zu tun, können Sie die Steuerelemente, die Farbe in einem AJAX UpdatePanel ändern, die separat von den anderen Elementen der Seite neu gerendert werden können und seinen aktuellen Inhalt beibehalten, bis das DOM ist über die JavaScript-Client-Seite geändert.

1

Das Festlegen des CssClass-Attributs ist viel näher an dem, was Sie mit PHP tun würden, also warum nicht einfach das tun?

Die zwei echten Vorteile von Skin-Dateien sind die Standardeinstellungen für alle Steuerelemente (keine skinId) oder die Einstellung von Eigenschaften, die nicht mit CSS gesteuert werden können.