But:
Réalisez en utilisant le fichier .cs dans MasterPage pour remplacer PageBase dans le projet.
motivation:
La motivation pour écrire cet article vient d’un projet de reconstruction. Dans le projet d'architecture B/S de .Net Framwork 2.0, les technologies PageBase et MasterPage ont été utilisées. Il a été constaté que chaque fois que la page est accédée, la page accède à PageBase et MasterPage en même temps, ce qui entraîne non seulement une dégradation des performances, mais peut même causer des problèmes lors de l'expansion et de l'ajustement futurs des fonctions du projet. Erreurs logiques cachées.
Aspects techniques :
PageBase : technologie souvent utilisée dans .Net Framework 1.1 pour encapsuler la même fonctionnalité de plusieurs pages. La classe PageBase.cs hérite de la classe System.Web.UI.Page. Les pages Web du projet héritent de la classe PageBase.cs. En remplaçant la méthode d'initialisation de la page dans la classe de base, les fonctions métier de PageBase sont appelées. tels que : les paramètres d'URL, la vérification des visites et d'autres fonctions (pour les méthodes d'implémentation spécifiques, veuillez vous référer à l'exemple officiel de Microsoft duwamishi).
MasterPage : une nouvelle fonctionnalité de .Net Framework 2.0. Elle comprend physiquement deux fichiers : le fichier .Master (balisage HTML) et le fichier .cs (code C#). Le fichier .Master implémente le dessin de la couche d'affichage et le fichier .cs implémente des fonctions spécifiques. Les pages Web qui héritent de MasterPage peuvent hériter du contenu de la couche d'affichage dans MasterPage. Pour dessiner un en-tête et un pied de page communs et personnaliser une mise en page unifiée, MasterPage est un bon choix.
Exigences de simulation :
Utilisez la technologie MasterPage pour remplacer PageBase afin d'implémenter la vérification des paramètres de la barre d'adresse.
Donnons une explication simple. Les informations de la table de connexion dans la base de données sont les suivantes :
Après vous être connecté au système, il y a des paramètres dans la barre d'adresse URL, comme suit :
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
A ce moment, l'utilisateur modifie manuellement les paramètres dans la barre d'adresse URL comme suit :
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Ceci est considéré comme une opération illégale et le système reviendra automatiquement à la page de connexion.
Première itération de code :
1. Référez-vous à la méthode traditionnelle PageBase :
L'approche traditionnelle de la page est la suivante :
classe publique PageBase : System.Web.UI.Page
{
publicPageBase()
{
}
/**//// <résumé>
/// Méthode de saisie
/// </summary>
protégé void Initialize()
{
//Insérer une logique métier commune
}
}
Page web:
classe partielle publique TestPage : PageBase
{
//Méthode traditionnelle d'appel de PageBase
/**///// <résumé>
/// Remplacez la méthode OnPreInit() de la classe de base et appelez la méthode de vérification générale
/// </summary>
/// <param name="e"></param>
remplacement protégé void OnInit (eventargs e)
{
base.Initialize();
}
}
Suivez cette approche et déplacez le code de PageBase vers MasterPage :
MasterPage.cs :
classe partielle publique MyMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
si (!IsPostBack)
{
//Méthode de vérification des appels
Initialiser();
}
}
}
Modifiez le code dans la page Web pour :
classe partielle publique TestPage : System.Web.UI.Page
{
// Imite la méthode PageBase et appelle la méthode dans Master
/**//// <résumé>
/// Remplacez la méthode OnPreInit() de la classe de base et appelez la méthode de vérification générale
/// </summary>
/// <param name="e"></param>
remplacement protégé void OnInit (eventargs e)
{
// Récupère la référence de la page maître
MyMasterPage myMasterPage = (MyMasterPage)this.Master;
//Appelle la méthode de vérification générale dans la page maître
si (!IsPostBack)
{
maMasterPage.Initialize();
}
}
}Remplacez la méthode Initialize() dans MasterPage par celle de l'instance, testez le code :
Étape 1 : Connectez-vous au système avec le nom d'utilisateur zhangsan et la connexion est réussie.
La page montre que Zhangsan est invité à se connecter.
L'adresse URL indique :
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Étape 2 : Modifiez manuellement la barre d'adresse URL : comme suit :
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
La page n'affichera pas la connexion de bienvenue lisi, mais reviendra à la page de connexion.
Réflexion : Bien que la fonction soit implémentée, il existe encore quelques liens insatisfaisants :
1. La méthode appelée par la sous-classe dans Master doit être une méthode publique ;
2. Bien qu'il ne soit pas nécessaire de modifier l'héritage de la page Web, vous devez toujours copier-coller et remplacer mécaniquement la méthode OnInit() de la classe de base.
Afin d'éliminer ces sentiments persistants, j'ai commencé :
Deuxième itération de code :
Modifiez le code dans MasterPage.cs :
classe partielle publique MyMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
si (!IsPostBack)
{
//Méthode de vérification des appels
CheckLogin();
}
}
/**//// <résumé>
/// Vérifier si l'accès est légal
/// </summary>
privé vide CheckLogin()
{
// Si le numéro dans l'url ou le numéro dans le cookie
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| chaîne.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Réponse.Redirect("Connexion.aspx");
}//Si le numéro dans l'url ne correspond pas au numéro dans le cookie, retournez à la page de connexion
sinon if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Réponse.Redirect("Connexion.aspx");
}
}
}Après la reconstruction, la page Web ne peut en aucun cas être modifiée. MasterPage appelle automatiquement la méthode de vérification dans sa propre méthode Page_Load() et définit la méthode de vérification sur privée, qui ne peut être appelée que par MasterPage lui-même pour améliorer la sécurité. À ce stade, le code semble idéal. Test :
Étape 1 : Connectez-vous au système avec le nom d'utilisateur Zhangsan.
La page de connexion de l'utilisateur est toujours affichée.
Le test a échoué.
Utilisez des points d'arrêt pour tracer le code et constater que le problème se produit dans l'extrait de code de la méthode CheckLogin() dans MasterPage.cs :
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| chaîne.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Réponse.Redirect("Connexion.aspx");
}
Étant donné que la page de connexion hérite de MasterPage, la méthode de vérification dans MasterPage.cs est automatiquement appelée lorsque la page est chargée et ses propres paramètres ne satisfont pas à la méthode string.IsNullOrEmpty(), elle revient donc à la page de connexion. La page est à nouveau chargée. La méthode de vérification dans la classe de base est appelée, formant ainsi une boucle infinie.
Dans la technologie PageBase, les pages Web peuvent hériter sélectivement de PageBase, mais dans la technologie MasterPage, afin d'obtenir un effet de couche d'affichage cohérent, la sélectivité des pages Web pour hériter de MasterPage est très faible, et nous ne devrions pas créer le même affichage en créant un nouveau. , MasterPage sans code de vérification est utilisé pour hériter des pages Web qui n'ont pas besoin d'hériter des fonctions de la classe de base. Cette méthode est évidemment déraisonnable. Afin de résoudre ce problème, la troisième itération a été lancée :
Importez le fichier de configuration :
<?xml version="1.0" encoding="utf-8" ?>
<pages>
<page de test>
<page title="TestPage" url="TestPage.aspx" needvalidate="true"/>
<page title="Connexion" url="Connexion.aspx" needvalidate="false"/>
</page de test>
<pages d'administration>
<page title="Page1" url="~/Admin/Page1.aspx" needvalidate="false"/>
<page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/>
</pagesadmin>
</pages>
Comme vous pouvez le constater, les pages à vérifier sont identifiées (needvalidate="true").
Créez une classe d'accès aux données XML :
classe publique XmlDAL
{
chaîne statique privée filePath = string.Empty;
XmlDAL statique()
{
//Initialiser le chemin du fichier de configuration
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <résumé>
/// Récupère la liste des pages qui doivent être vérifiées
/// </summary>
/// <returns>Liste des pages nécessitant une vérification</returns>
public statique IList<string> GetValidatePages()
{
IList<string> pages = new List<string>();
// Si le fichier de configuration spécifié existe
si (System.IO.File.Exists (filePath))
{
essayer
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
// Récupère le nœud racine du fichier de configuration
Racine XmlNode = xmlDoc.DocumentElement ;
string xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// Collection de nœuds de commodité
foreach (nœud XmlNode dans nodeList)
{
pages.Add(node.Attributes["titre"].Value);
}
}
attraper (Exception ex)
{
lancer une nouvelle exception (ex.Message);
}
}
pages de retour ;
}
}
Refactorisez le code dans MasterPage.cs et ajoutez la méthode IsValidateNeeded(string url) pour détecter si la page actuelle nécessite une vérification. Modifiez la méthode de vérification :
classe partielle publique MyMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
si (!IsPostBack)
{
//Méthode de vérification des appels
CheckLogin();
}
}
/**//// <résumé>
/// Vérifier si l'accès est légal
/// </summary>
privé vide CheckLogin()
{
// Détermine si la page actuellement consultée nécessite une vérification
si (IsValidateNeeded(Request.RawUrl))
{
// Si le numéro dans l'url ou le numéro dans le cookie
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| chaîne.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Réponse.Redirect("Connexion.aspx");
}//Si le numéro dans l'url ne correspond pas au numéro dans le cookie, retournez à la page de connexion
sinon if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Réponse.Redirect("Connexion.aspx");
}
}
}
/**//// <résumé>
/// Vérifier si la page actuelle nécessite une vérification
/// </summary>
/// <param name="currentPage">Nom de la page actuelle</param>
/// <returns>Si le statut doit être vérifié</returns>
bool privé IsValidateNeeded (URL de chaîne)
{
bool isNeeded = faux ;
// La méthode GetValidatePages() renvoie la liste des pages à vérifier
IList<string> pages = XmlDAL.GetValidatePages();
IEnumerator<string> ie = pages.GetEnumerator();
while (c'est-à-dire.MoveNext())
{
// Si la page actuelle nécessite une vérification
if (url.Contains(ie.Current))
//Retour au statut nécessitant une vérification
return isNeeded = vrai ;
}
le retour est nécessaire ;
}
}
Pour tester :
Étape 1 : Connectez-vous au système avec le nom d'utilisateur zhangsan et la connexion est réussie.
La page montre que Zhangsan est invité à se connecter.
L'adresse URL indique :
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Étape 2 : Modifiez manuellement la barre d'adresse URL : comme suit :
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
La page n'affichera pas la connexion de bienvenue lisi, mais reviendra à la page de connexion.
Ceci conclut mon itération de code.
Téléchargement des codes :