Question

Je souhaite obtenir un type de "BasePage". objet que je crée. Chaque objet de page est basé sur BasePage. Par exemple, j'ai un Login.aspx et dans mon code-behind et une classe qui a une méthode Display:

Display(BasePage page) {
    ResourceManager manager = new ResourceManager(page.GetType());
}

Dans ma structure de projet, j'ai un fichier de ressources par défaut et un fichier de ressources psuedo-translation. Si je mets quelque chose comme ça:

Display(BasePage page) {
    ResourceManager manager = new ResourceManager(typeof(Login));
}

il retourne la page traduite. Après quelques recherches, j'ai trouvé cette page.GetType (). ToString () a renvoyé quelque chose qui a l'effet suivant: "ASP_login.aspx" Comment puis-je obtenir le code réel derrière le type de classe, de manière à obtenir un objet de type "Connexion"? qui est dérivé de "BasePage"?

Merci d'avance!

Était-ce utile?

La solution

Si votre code-à côté ressemble à ceci:

public partial class _Login : BasePage 
 { /* ... */ 
 }

Vous obtiendrez alors l'objet Type avec typeof (_Login) . Pour obtenir le type de manière dynamique, vous pouvez le trouver récursivement:

Type GetCodeBehindType()
 { return getCodeBehindTypeRecursive(this.GetType());
 }

Type getCodeBehindTypeRecursive(Type t)
 { var baseType = t.BaseType;
   if (baseType == typeof(BasePage)) return t;
   else return getCodeBehindTypeRecursive(baseType);
 }

Autres conseils

Après quelques recherches supplémentaires, j'ai constaté que si j'appelais Page.GetType (). BaseType, il renvoie le type code-behind de la page Aspx.

page.GetType (). BaseType, cela a déjà été dit, mais permettez-moi de préciser pourquoi.

Les pages Aspx héritent de leurs pages code-behind, ce qui signifie que la hiérarchie d'héritage ressemble à ceci:

...
Page
BasePage
Login
ASP_Login

Où le haut est le parent et le bas est l'enfant.

Ceci permet à votre code de rester accessible depuis la page aspx, sans exiger que tout le code généré lié à votre page aspx réelle soit copié dans la page de la classe de base.

Cela dépend d'où vous appelez Display (). Si vous l'appelez depuis l'ASPX, vous aurez alors le mot-clé "ASP_login.aspx". Si vous l’appelez depuis le code-behind (c’est-à-dire la méthode Page_Load ()), vous devriez obtenir le type de page de connexion.

Au lieu de passer la page, vous pouvez envisager d'utiliser simplement la propriété Page (c'est-à-dire this.Page.GetType ()), qui devrait toujours être le type de page / codebehind actuel, si je me souviens bien.

Je devrais également préciser que vous pourriez envisager de transférer ce type de contenu hors de ASPX / codeBear et de le placer dans une sorte de service. Il est généralement judicieux de minimiser le nombre de choses que vous faites dans un code et de placer la logique dans une classe de présentateur et de suivre le modèle MVP pour le développement de formulaires Web ASP.NET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top