Zweck:
Nutzen Sie die .cs-Datei in MasterPage, um PageBase im Projekt zu ersetzen.
Motivation:
Die Motivation zum Schreiben dieses Artikels stammt aus einer Projektrekonstruktion. Im B/S-Architekturprojekt von .Net Framwork 2.0 wurden sowohl PageBase- als auch MasterPage-Technologien verwendet. Es wurde festgestellt, dass die Seite bei jedem Zugriff gleichzeitig auf PageBase und MasterPage zugreift, was nicht nur zu Leistungseinbußen führt. Es kann jedoch auch zu Problemen bei der Erweiterung und Anpassung zukünftiger Projektfunktionen kommen. Versteckte Logikfehler.
Technische Aspekte:
PageBase: Eine Technologie, die häufig in .Net Framework 1.1 verwendet wird, um die gleiche Funktionalität mehrerer Seiten zu kapseln. Die PageBase.cs-Klasse erbt von der System.Web.UI.Page-Klasse. Die Webseiten im Projekt erben von der PageBase.cs-Klasse. Durch Überschreiben der Seiteninitialisierungsmethode in der Basisklasse werden die Geschäftsfunktionen in PageBase aufgerufen. wie zum Beispiel: URL-Parameter, Besuche speichern und andere Funktionen (spezifische Implementierungsmethoden finden Sie im offiziellen Duwamishi-Beispiel von Microsoft).
MasterPage: Eine neue Funktion in .Net Framework 2.0. Sie umfasst physisch zwei Dateien: .Master-Datei (HTML-Markup) und .cs-Datei (C#-Code). Die .Master-Datei implementiert das Zeichnen von Anzeigeebenen und die .cs-Datei implementiert bestimmte Funktionen. Webseiten, die von MasterPage erben, können den Inhalt der Anzeigeebene in MasterPage erben. Um eine gemeinsame Kopf- und Fußzeile zu zeichnen und ein einheitliches Layout anzupassen, ist MasterPage eine gute Wahl.
Simulationsanforderungen:
Verwenden Sie die MasterPage-Technologie, um PageBase zu ersetzen und die Überprüfung der Adressleistenparameter zu implementieren.
Lassen Sie uns eine einfache Erklärung geben. Die Anmeldetabelleninformationen in der Datenbank lauten wie folgt:
Nach der Anmeldung beim System gibt es in der URL-Adressleiste folgende Parameter:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Zu diesem Zeitpunkt ändert der Benutzer die Parameter in der URL-Adressleiste manuell wie folgt:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Dies gilt als illegaler Vorgang und das System springt automatisch zur Anmeldeseite zurück.
Erste Code-Iteration:
1. Beziehen Sie sich auf die traditionelle PageBase-Methode:
Der traditionelle Page-Ansatz ist:
öffentliche Klasse PageBase: System.Web.UI.Page
{
publicPageBase()
{
}
/**//// <Zusammenfassung>
/// Eingabemethode
/// </summary>
protected void Initialize()
{
//Gemeinsame Geschäftslogik einfügen
}
}
Webseite:
öffentliche Teilklasse TestPage: PageBase
{
//Traditionelle Methode zum Aufrufen von PageBase
/**///// <Zusammenfassung>
/// Überschreiben Sie die OnPreInit()-Methode der Basisklasse und rufen Sie die allgemeine Überprüfungsmethode auf
/// </summary>
/// <param name="e"></param>
protected override void OnInit(eventargs e)
{
base.Initialize();
}
}
Folgen Sie diesem Ansatz und verschieben Sie den Code in PageBase in MasterPage:
MasterPage.cs:
öffentliche Teilklasse MyMasterPage: System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Überprüfungsmethode aufrufen
Initialisieren();
}
}
}
Ändern Sie den Code auf der Webseite wie folgt:
öffentliche Teilklasse TestPage: System.Web.UI.Page
{
// Imitiere die PageBase-Methode und rufe die Methode im Master auf
/**//// <Zusammenfassung>
/// Überschreiben Sie die OnPreInit()-Methode der Basisklasse und rufen Sie die allgemeine Überprüfungsmethode auf
/// </summary>
/// <param name="e"></param>
protected override void OnInit(eventargs e)
{
// Holen Sie sich die Referenz auf die Masterseite
MyMasterPage myMasterPage = (MyMasterPage)this.Master;
// Rufen Sie die allgemeine Überprüfungsmethode auf der Masterseite auf
if (!IsPostBack)
{
myMasterPage.Initialize();
}
}
}Ersetzen Sie die Initialize()-Methode in MasterPage durch die in der Instanz, Testcode:
Schritt 1: Melden Sie sich mit dem Benutzernamen zhangsan beim System an. Die Anmeldung ist erfolgreich.
Auf der Seite ist zu sehen, dass Zhangsan sich gerne anmelden kann.
Die URL-Adresse zeigt:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Schritt 2: Ändern Sie die URL-Adressleiste manuell wie folgt:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Auf der Seite wird nicht die Willkommens-Lisi-Anmeldung angezeigt, sondern Sie gelangen zurück zur Anmeldeseite.
Reflexion: Obwohl die Funktion implementiert ist, gibt es immer noch einige unbefriedigende Links:
1. Die von der Unterklasse in Master aufgerufene Methode muss eine öffentliche Methode sein.
2. Obwohl die Vererbung der Webseite nicht geändert werden muss, müssen Sie die OnInit()-Methode der Basisklasse dennoch mechanisch kopieren, einfügen und überschreiben.
Um diese anhaltenden Gefühle zu beseitigen, begann ich:
Zweite Code-Iteration:
Ändern Sie den Code in MasterPage.cs:
öffentliche Teilklasse MyMasterPage: System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Überprüfungsmethode aufrufen
CheckLogin();
}
}
/**//// <Zusammenfassung>
/// Überprüfen Sie, ob der Zugriff legal ist
/// </summary>
private void CheckLogin()
{
// Wenn die Zahl in der URL oder die Zahl im Cookie
if (string.IsNullOrEmpty(Request.QueryString["id"])
||. string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//Wenn die Zahl in der URL nicht mit der Zahl im Cookie übereinstimmt, kehren Sie zur Anmeldeseite zurück
else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}Nach der Rekonstruktion kann die Webseite in keiner Weise geändert werden. MasterPage ruft die Überprüfungsmethode automatisch in seiner eigenen Page_Load()-Methode auf und setzt die Überprüfungsmethode auf privat, was zur Verbesserung der Sicherheit nur von MasterPage selbst aufgerufen werden kann. Zu diesem Zeitpunkt scheint der Code ideal zu sein:
Schritt 1: Melden Sie sich mit dem Benutzernamen zhangsan am System an.
Die Benutzeranmeldeseite wird weiterhin angezeigt.
Test fehlgeschlagen.
Verwenden Sie Haltepunkte, um den Code zu verfolgen und festzustellen, dass das Problem im Codeausschnitt in der CheckLogin()-Methode in MasterPage.cs auftritt:
if (string.IsNullOrEmpty(Request.QueryString["id"])
||. string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
Da die Anmeldeseite von MasterPage erbt, wird die Überprüfungsmethode in MasterPage.cs beim Laden der Seite automatisch aufgerufen und ihre eigenen Parameter erfüllen nicht die Methode string.IsNullOrEmpty(), sodass sie zur Anmeldeseite zurückspringt Die Seite wird erneut geladen. Die Verifizierungsmethode in der Basisklasse wird aufgerufen, wodurch eine Endlosschleife entsteht.
In der PageBase-Technologie können Webseiten selektiv von PageBase erben. In der MasterPage-Technologie ist die Selektivität von Webseiten zum Erben von MasterPage jedoch sehr gering, um einen konsistenten Anzeigeebeneneffekt zu erzielen, und wir sollten nicht dieselbe Anzeige erstellen, indem wir eine erstellen Neu: MasterPage ohne Bestätigungscode wird verwendet, um Webseiten zu erben, die die Basisklassenfunktionen nicht erben müssen. Um dieses Problem zu lösen, wurde die dritte Iteration gestartet:
Importieren Sie die Konfigurationsdatei:
<?xml version="1.0"kodierung="utf-8" ?>
<Seiten>
<Testseite>
<page title="TestPage" url="TestPage.aspx" needvalidate="true"/>
<page title="Login" url="Login.aspx" needvalidate="false"/>
</testseite>
<adminpages>
<page title="Page1" url="~/Admin/Page1.aspx" needvalidate="false"/>
<page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/>
</adminpages>
</pages>
Wie Sie sehen, werden die Seiten identifiziert, die überprüft werden müssen (needvalidate="true").
Erstellen Sie eine XML-Datenzugriffsklasse:
öffentliche Klasse XmlDAL
{
privater statischer String filePath = string.Empty;
statisches XmlDAL()
{
//Konfigurationsdateipfad initialisieren
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <Zusammenfassung>
/// Holen Sie sich die Liste der Seiten, die überprüft werden müssen
/// </summary>
/// <returns>Liste der Seiten, die überprüft werden müssen</returns>
öffentliche statische IList<string> GetValidatePages()
{
IList<string> seiten = new List<string>();
// Wenn die angegebene Konfigurationsdatei vorhanden ist
if (System.IO.File.Exists(filePath))
{
versuchen
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
// Den Stammknoten der Konfigurationsdatei abrufen
XmlNode root = xmlDoc.DocumentElement;
string xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// Convenience-Knotensammlung
foreach (XmlNode-Knoten in nodeList)
{
seiten.Add(node.Attributes["title"].Value);
}
}
Catch (Ausnahme ex)
{
throw new Exception(ex.Message);
}
}
Rückkehrseiten;
}
}
Refaktorieren Sie den Code in MasterPage.cs und fügen Sie die Methode IsValidateNeeded(string url) hinzu, um zu erkennen, ob die aktuelle Seite eine Überprüfung erfordert. Ändern Sie die Überprüfungsmethode:
öffentliche Teilklasse MyMasterPage: System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Überprüfungsmethode aufrufen
CheckLogin();
}
}
/**//// <Zusammenfassung>
/// Überprüfen Sie, ob der Zugriff legal ist
/// </summary>
private void CheckLogin()
{
// Bestimmen Sie, ob die aktuell aufgerufene Seite eine Überprüfung erfordert
if (IsValidateNeeded(Request.RawUrl))
{
// Wenn die Zahl in der URL oder die Zahl im Cookie
if (string.IsNullOrEmpty(Request.QueryString["id"])
||. string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//Wenn die Zahl in der URL nicht mit der Zahl im Cookie übereinstimmt, kehren Sie zur Anmeldeseite zurück
else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}
/**//// <Zusammenfassung>
/// Überprüfen Sie, ob die aktuelle Seite eine Überprüfung erfordert
/// </summary>
/// <param name="currentPage">Aktueller Seitenname</param>
/// <returns>Ob der Status überprüft werden muss</returns>
privater bool IsValidateNeeded(String-URL)
{
bool isNeeded = false;
// Die Methode GetValidatePages() gibt die Liste der Seiten zurück, die überprüft werden müssen
IList<string> seiten = XmlDAL.GetValidatePages();
IEnumerator<string> ie = page.GetEnumerator();
while (ie.MoveNext())
{
// Wenn die aktuelle Seite eine Überprüfung erfordert
if (url.Contains(ie.Current))
//Zu dem Status zurückkehren, der eine Überprüfung erfordert
return isNeeded = true;
}
return isNeeded;
}
}
Zum Testen:
Schritt 1: Melden Sie sich mit dem Benutzernamen zhangsan beim System an. Die Anmeldung ist erfolgreich.
Auf der Seite ist zu sehen, dass Zhangsan sich gerne anmelden kann.
Die URL-Adresse zeigt:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Schritt 2: Ändern Sie die URL-Adressleiste manuell wie folgt:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Auf der Seite wird nicht die Willkommens-Lisi-Anmeldung angezeigt, sondern Sie gelangen zurück zur Anmeldeseite.
Damit ist meine Code-Iteration abgeschlossen.
Code-Download: