2010-08-06 7 views
2

Voici mon code page maître derrière:Qu'est-ce que je fais mal dans ASP.NET

namespace mysite.MasterPages 
{ 
    public partial class Main : System.Web.UI.MasterPage 
    { 
     public bool isLoggedIn; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      isLoggedIn = Request.IsAuthenticated;  // Is the user currently logged in 
     } 
    } 
} 

Voici mon code page registre derrière:

namespace mysite 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (((MasterPage)Page.Master).isLoggedIn) 
      { 
       Response.Redirect("default.aspx"); 
      } 
     } 
    } 
} 

Je suis en train de faire le isLoggedIn accessible à toutes les pages en utilisant cela comme une page maître! Je reçois des erreurs telles que:

Erreur 2 Le nom « isLoggedIn » n'existe pas dans le contexte actuel

Erreur 3 « System.Web.UI.MasterPage » ne contient pas une définition pour « isLoggedIn » et aucune méthode d'extension « isLoggedIn » accepter un premier argument de type « System.Web.UI.MasterPage » n'a pu être trouvée (vous manque une directive à l'aide ou une référence d'assemblage?)

Toute aide appréciée.

+0

Pourquoi ne pas simplement vérifier 'Request.IsAuthenticated' sur les pages qui en ont besoin plutôt que d'attribuer le résultat de' Request.IsAuthenticated' à une autre variable? – CraigTP

+0

Je viens d'un contexte ASP classique, et j'ai toujours assigné des noms de variables plus significatifs à ce genre de choses, et on m'a appris qu'il vaut mieux l'assigner à une variable que de continuer à la demander. –

+0

btw, quel type d'authentification utilisez-vous? formulaires (propre page de connexion) ou de base (fenêtre de connexion par défaut du navigateur)? – abatishchev

Répondre

2

ajouter <%@ MasterType VirtualPath="~/Main.master" %> au balisage de votre page.

et votre type this.Master devient AlphaPack.MasterPages.Main au lieu de System.Web.UI.MasterPage. Ainsi, vous pourrez y accéder sans fonte:

this.Master.IsLoggednIn 

Actuellement, vous devez faire ensuite:

((AlphaPack.MasterPages.Main)this.Master).isLoggednIn 

Et mieux - créer une propriété. Et conserver les données ne sont pas en variable, mais dans ViewState (lire Control State vs. View State):

namespace AlphaPack.MasterPages 
{ 
    public partial class Main : System.Web.UI.MasterPage 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      this.IsLoggedIn = Request.IsAuthenticated; 
     } 

     public bool IsLoggedIn 
     { 
      get { return this.ViewState["isLoggedIn"] as bool? ?? false; } 
      set { this.ViewState["isLoggedIn"] = value; } 
     } 
    } 
} 

Qu'en est-code-behind. Je recommande d'utiliser le projet Web App, pas le projet Web Site (qui est obsolète)!

La prochaine syntaxe de balisage est utilisée. application Web:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyPage.aspx.cs" Inherits="MyNamespace.MyPage" MasterPageFile="~/MyMaster.master" Title="MyTitile" %> 

et site web:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyPage.aspx.cs" Inherits="MyPage" MasterPageFile="~/MyMaster.master" Title="MyTitile" %> 
+0

Merci, et comment pourrais-je accéder à la variable sur d'autres pages? Je continue à recevoir des erreurs. (Juste pour que vous sachiez que vous avez manqué un}) –

+0

@Tom: Merci, corrigé. Voir mon post-deuxième paragraphe mis à jour: utilisez 'this.Master.IsLoggednIn' sur chaque page où vous mettez' MasterType'. Voir plus à http://msdn.microsoft.com/en-us/library/c8y19k6h.aspx – abatishchev

0

Habituellement, on stocke de tels 'états' globaux dans une variable de session. Le transmettez-vous en tant que paramètre de chaîne de requête?

Et pourquoi ne mettez-vous pas le code dans le code?

Edit 1:

Il suffit de déplacer cette logique:

Response.Redirect("default.aspx"); 

directement dans votre masterpage:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.IsAuthenticated)  // Is the user currently logged in 
     { 
      Response.Redirect("default.aspx"); 
     } 
    } 

Si tel est le comportement par défaut que vous voulez pour toutes les pages qui utiliser cette page maître.

Edit 2:

vous avez dit dans un commentaire:

et comment pourrais-je aller sur l'accès à la variable sur d'autres pages?

Il y a 3 façons je peux penser:

  • chaîne de requête (par page Demande)
  • ViewState (par page)
  • variable de session (disponible au niveau mondial)
+0

Il provient du système d'appartenance ASP et non de la chaîne de requête. –

+0

C'est assez juste, mais pourquoi n'utilisez-vous pas le code derrière? Je soupçonne que votre arrière-plan ASP classique peut jouer un rôle. – Darknight

+0

Oui, je suis habitué à tout avoir sur une seule page! Je ne comprends toujours pas le code derrière, donc je vais le lire. –

0

Le problème ici est que vous déclarez isLoggedIn à l'intérieur d'un bloc de code en ligne, de sorte qu'il sera limité à ce bloc.

Vous devrez l'ajouter en tant que variable dans la classe code-behind ou dans les balises <script runat="server"></script>, si vous ajoutez le code côté serveur, c'est-à-dire.(Dégrossi par souci de concision):

<script runat="server"> 

    public bool IsLoggedIn; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     IsLoggedIn = Request.IsAuthenticated; 
    } 

</script> 

Vous pouvez ensuite accéder à la page principale dans les sous-pages comme ceci:

<% 
    if (((MasterPage)Page.Master).IsLoggedIn) 
    { 
    } 
%> 

Cependant, je ne suis pas sûr que ce soit la meilleure façon d'obtenir ce que vous vouloir. Je retirerais probablement cette logique de la page maîtresse et la collerais dans une classe ou un service d'authentification spécialement conçu.

+0

Merci, mais la variable est connecté ne semble pas être accessible aux pages qui utilisent cette page maître qui est le problème. –

+0

Très vrai, j'ai mis à jour ma réponse. – nukefusion

+0

Merci, cela n'a pas semblé fonctionner encore, j'ai changé la question car tout le monde me dit d'utiliser le code derrière –

1
if (((MasterPage)Page.Master).isLoggedIn) 

Devrait être

if (((mysite.MasterPages.Main)Page.Master).isLoggedIn) 

vous lancez Master à un type MasterPage (qui ne sert à rien car il est déjà un MasterPage). Mais MasterPage ne contient pas la propriété isLoggedIn. C'est pourquoi vous ne pouvez pas y accéder.

Alors, juste jeté la Master propriété du bon type, dans votre cas mysite.MasterPages.Main