2010-03-16 24 views
0

donc c'est le scénario:Comment faire un server.transfer() avec un Response.AddHeader ("refresh", "secondes") et ne pas obtenir une erreur 404?

J'ai une classe de base pour toutes les pages contrôlées connexion-:

public class SessionControlledPage : Page 
{ 
    protected virtual void Page_Load(Object sender, EventArgs e) 
    { 
     Response.AddHeader("Refresh", Convert.ToString(Session.Timeout * 60 + 5)); 
     if (Session.IsNewSession) 
     { 
      Response.Redirect("~/login.aspx"); 
     } 
    } 
} 

Et une page regularpage.aspx qui inherints de la classe de base:

public partial class RegularPage : SessionControlledPage 
{ 
    override protected void Page_Load(Object sender, EventArgs e) 
    { 
     base.Page_Load(sender, e); 

     Server.Transfer("~/otherpage.aspx"); 
    } 
} 

maintenant disons que l'URL d'origine était http://localhost/regularpage.aspx et que Session.Timeout = 5. Le problème apparaît lorsque l'actualisation se produit après le transfert. J'obtiens une erreur 404 Not Found et l'URL change pour http://localhost/305. Notez que 5 * 60 + 5 = 305.

Savez-vous pourquoi cela se produit-il? avez une solution? PD: J'utilise le transfert car j'ai besoin d'accéder à certaines propriétés de regularpage.aspx sur otherpage.aspx, peut-être pourriez-vous fournir une autre solution pour cela.

Répondre

1

Il y a très peu de raison d'appeler base.Page_Load si tout ce que vous allez faire est d'appeler Server.Transfer. Qu'essayez-vous exactement d'accomplir? Si vous accédez à certaines propriétés, vous devez en faire abstraction dans une logique métier qui ne repose pas sur l'objet Page.

C'est également ce qui provoque le problème 404 ... pour que cela se produise, le problème doit être dans la sortie rendue de la page (vérifiez-la). Il semble que vous supprimez une page juste après la balise meta-refresh, puis que vous démarrez une nouvelle page et qu'ASP.NET ne fait que tout basculer dans le même flux de réponses. En bref, vous le faites mal. :) Vous pourriez être en mesure de résoudre ce problème avec un Response.Clear() bien placé, mais ce n'est pas le vrai problème ici ... et vous perdriez votre balise d'actualisation.

+0

merci Bryan, en réalité le server.transfer() n'est pas dans le page_load est sur une autre méthode (ceci est un exemple) et cette méthode est appelée après une recherche est effectuée sur la page et un résultat est cliqué, j'utilise le informations associées au lien pour le transmettre à l'autre page. J'appelle base.Page_Load() parce que je surcharge la méthode Page_Load de ma classe de base, et aussi en raison de l'ordre d'exécution sur le cycle de vie des pages, le code dans le Page_Load enfant s'exécuterait avant le Page_Load sur la classe parent, J'ai besoin du code parent Page_Load pour exécuter avant pas après. – Unlimited071

+0

@Brian pouvez-vous s'il vous plaît m'en dire plus sur la logique métier abstraite et comment pourrais-je l'utiliser? J'ai juste besoin de quelques informations simples de la "page normale" fondamentalement 3 codes entiers. Merci. – Unlimited071

+0

Il est impossible de vous dire comment faire ceci sans savoir ce que vous essayez de faire. Mais en général, toute application ASP.NET bien conçue fera le moins possible dans le code de la couche de présentation et déchargera les tâches dans une couche de logique métier. 265 caractères ne suffisent pas à expliquer cela! Avez-vous résolu le problème original? Vous n'avez pas répondu à ce sujet ... – Bryan