2010-02-18 4 views
0

Im utilisant intelligencia urlrewriter comme module de réécriture d'URL. J'ai un problème très étrange qui se produit seulement quand une URL est réécrite mais pour la rendre plus amusante, pas sur toutes les pages réécrites.ASP.NET Événements multiples Page_Load avec réécriture d'URL

Edit: oublié de vous dire quel est le problème Boing Boing. le problème est que mon événement Page_Load est renvoyé 2 fois.

Voici comment ma forme adaptateur rewrite ressemble:

using System; 

using System.Web.UI; en utilisant System.Web; en utilisant System.Web.UI.WebControls;

public class FormRewriterControlAdapter: System.Web.UI.Adapters.ControlAdapter {

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
{ 

    base.Render(new RewriteFormHtmlTextWriter(writer)); 

} 

}

public class RewriteFormHtmlTextWriter: HtmlTextWriter {

public RewriteFormHtmlTextWriter(HtmlTextWriter writer) 
    : base(writer) 
{ 
    this.InnerWriter = writer.InnerWriter; 
} 

public RewriteFormHtmlTextWriter(System.IO.TextWriter writer) 
    : base(writer) 
{ 
    base.InnerWriter = writer; 
} 

public override void WriteAttribute(string name, string value, bool fEncode) 
{ 

    // If the attribute we are writing is the "action" attribute, and we are not on a sub-control, 
    // then replace the value to write with the raw URL of the request - which ensures that we'll 
    // preserve the PathInfo value on postback scenarios 

    if ((name == "action")) 
    { 

     HttpContext Context = default(HttpContext); 
     Context = HttpContext.Current; 

     if (Context.Items["ActionAlreadyWritten"] == null) 
     { 

      // Because we are using the UrlRewriting.net HttpModule, we will use the 
      // Request.RawUrl property within ASP.NET to retrieve the origional URL 
      // before it was re-written. You'll want to change the line of code below 
      // if you use a different URL rewriting implementation. 

      value = Context.Request.RawUrl; 

      // Indicate that we've already rewritten the <form>'s action attribute to prevent 
      // us from rewriting a sub-control under the <form> control 

      Context.Items["ActionAlreadyWritten"] = true; 
     } 

    } 


    base.WriteAttribute(name, value, fEncode); 

} 

}

Un d voilà comment mon web.config ressemble

 <!-- Here the double page_load occurs --> 
    <rewrite url="~/car-parts/(\d+)/(.+)" to="~/Products.aspx?type=parts&amp;iid=$1&amp;cid=9" /> 
    <rewrite url="~/car-stereo/(\d+)/(.+)" to="~/Products.aspx?type=stereo&amp;iid=$1&amp;cid=10" /> 



    <!-- this is working correctly --> 
    <rewrite url="~/car-parts/browse-by-type/(\d+)/(.+)/(\d+)/(\d+)" to="~/Browse.aspx?cid=9&amp;type=country&amp;countryid=$1&amp;p=$3&amp;filter=$4" /> 

Je ne sais pas où plus regarder, j'ai vérifié mon code html depuis que je l'ai lu cela pourrait couse ce problème.

Meilleures salutations, Mark

+0

Vous n'avez pas dit quel est le problème très étrange. –

Répondre

0

Enfin je l'ai trouvé, il était de ne pas avoir rien à voir avec le module de réécriture, c'est qui a causé le problème:

Dans l'un de mes usercontrols je l'ai utilisé UpdateProgress

<asp:UpdateProgress runat="server" AssociatedUpdatePanelID="upNewsletter" DisplayAfter="0"> 
    <ProgressTemplate> 
     <asp:Image runat="server" ID="imgLoading" ImageUrl="~/Images/Template/loading.gif" /> 
    </ProgressTemplate> 
</asp:UpdateProgress> 

des thats maintenant où le problème est, dans le asp: tag d'image. Je l'ai remplacé par une balise img régulière et maintenant tout fonctionne bien à nouveau. Il m'a fallu du temps pour comprendre cela et j'espère pouvoir vous sauver la migraine.

Sincères salutations

0

J'ai trouvé ce poste la recherche de plusieurs page_loads, mais j'ai eu le problème en utilisant une CollapsePanel dynamique créée à l'aide d'une image créée dynamiquement. En remplissant le ImageUrl à une image par défaut, le problème a été résolu.

header.Controls.Add(new Image 
{ 
    ID = string.Format("headerImage_{0}", panelId), 
    EnableViewState = false, 
    ImageUrl = "~/Images/collapse.jpg" 
}); 
1

lorsque j'utilise cette règle de réécriture dans mes règles, ce problème a été résolu:

<rewrite url="^(/.+(\.gif|\.flv|\.swf|\.png|\.jpg|\.ico|\.pdf|\.doc|\.xls|\.css|\.zip|\.rar|\.js|\.xml|\.mp3)(\?.+)?)$" to="$1" processing="stop" /> 

mais souvenez-vous d'utiliser cette règle après tous vos Css/js/.jpg /... règles.

Questions connexes