Ich habe den folgenden Code in meiner ASPX-Seite:
%Vor%Ich verwende den VirtualPath, um auf Eigenschaften in meiner MasterPage zuzugreifen. So weit, so gut.
Aber jetzt muss ich masterpages programmatisch ändern. Ich weiß, dass um eine Masterseite zu ändern, ich auf dem page_init tun muss:
%Vor%Aber ich habe keine Ahnung, wie man den VirtualPath ändert.
Ich nehme an, dass Sie MasterType verwenden, weil Sie eine Eigenschaft benötigen (die Sie auch benötigen würden, wenn Sie zu einem anderen Master wechseln würden), sagen Sie, dass Sie Master.MyButton
verwenden, diese in eine Basisklasse verschieben und diesen Typ verwenden Ihre @MasterType
-Deklaration:
Jetzt auf Ihrer Seite sieht Ihre MasterType-Deklaration wie folgt aus:
%Vor%Wenn Sie nun Ihren virtuellen Pfad ändern, spielt es keine Rolle, dass Sie auf Eigenschaften in der Basis zugreifen, und zwar für beide Masterseiten.
Kurz gesagt, Sie können das nicht tun.
Sie sehen, das "MasterType" -Verzeichnis stellt type Informationen bereit, die vom Compiler zur Kompilierzeit verwendet werden.
Wenn Sie etwas wie Page.MasterPage.btn1.Text = "abcd"
schreiben, muss der Compiler wissen, wie er mit diesem "btn1" -Teil umgehen soll. Was ist es? Ist es ein Feld? Ein Besitz? Eine Methode? Eine geschachtelte Klasse? Oder gibt es das überhaupt nicht?
Um diese Fragen zu beantworten, muss der Compiler den -Typ des Ausdrucks Page.MasterPage
kennen. Und genau das bieten Sie mit der Direktive "MasterType".
Das VirtualPath-Attribut sagt im Grunde: "Kompilieren Sie zuerst diese andere Datei, und das Ergebnis der Kompilierung ist der Typ der Master-Eigenschaft dieser Seite". So weiß der Compiler.
Aus all dem kann man eine Schlussfolgerung ziehen: Es ist nicht nur unmöglich, den Typ einer Eigenschaft zur Laufzeit zu ändern, es macht auch keinen Sinn - der Code wurde bereits kompiliert, Sie brauchen ihn nicht keine Informationen zur Kompilierzeit mehr!
Die nächste Frage, die sich stellt, lautet: Warum wolltest du das überhaupt machen ?
Wenn Sie nur verschiedene Eigenschaften verwenden möchten, die auf verschiedenen Masterseiten deklariert sind, können Sie den Rat von Nick Craver und Nathan Taylor annehmen und eine Basisklasse deklarieren, die all diese Felder / Eigenschaften enthält und von der alle Masterseiten übernommen werden diese Basisklasse, und dann haben Sie Ihre MasterType-Direktive diese Basisklasse über das TypeName-Attribut angeben.
Allerdings würde ich diesen Weg nur gehen, wenn beide Masterseiten in der Logik ähnlich sind, nur im Design unterschiedlich. Das heißt, eine Seite sollte keine Eigenschaften haben, die die andere nicht hat. Andernfalls ist es einfach nicht richtig, zwei Untermengen von Eigenschaften / Methoden / Feldern in einer Klasse zu haben (was die Basisklasse ist), wenn nur eine dieser Untergruppen zu irgendeiner Zeit verwendet wird. Und es ist nicht richtig, eine gemeinsame Basis für zwei Klassen zu schaffen, wenn es dort nicht wirklich eine gemeinsame Basis gibt. Aka "schlechtes Design". In diesem Fall sollten Sie Ihr ursprüngliches Design wahrscheinlich überdenken.
Wenn Ihr Zweck etwas anderes ist - bitte erklären Sie, und ich werde versuchen, einige Lösungen für Sie zu finden.
Viel Glück damit.
Habe etwas gegraben und das in den ASP.NET Foren gefunden:
Um den MasterType dynamisch zu ändern, Sie sollten eine Basismasterseite erstellen Klasse und lass jede masterPage zu erben von ihm.
Dann können Sie diese Basis-MasterPage verwenden Geben Sie als MasterType für Ihre Seite ein.
siehe "Strong Typing für Dynamic Master Seiten "in diesem Link .
Grüße,
Anas Ghanem
Scheint so ein ziemlich vernünftiger Ansatz zu sein, solange Sie mit dem Casting leben können.
Wenn Sie etwas Zeit sparen und vermeiden möchten, dass Sie bei jedem Aufruf das Casting durchführen müssen, könnten Sie ein Feld in Ihrem Basis-MasterPage-Typ namens "CurrentMaster" oder etwas Ähnliches definieren und dann eine Bedingung für die aktuelle MasterPage-Datei verwenden setzt auch den 'CurrentMaster' mit dem passenden Typ.
%Vor%Tags und Links c# asp.net master-pages