2010-09-29 5 views
0

Je travaille sur la réécriture des URLs Urlrewriting.net, et j'ai rencontré ce qui semble être un problème courant mais je peux sembler le résoudre. Je vais présenter un cas simplifié.Urlrewriting.net IsPostBack toujours faux

La réécriture d'URL fonctionne parfaitement avec la règle:

<urlrewritingnet rewriteOnlyVirtualUrls="true" defaultPage="default.aspx" defaultProvider="RegEx" xmlns="http://www.urlrewriting.net/schemas/config/2006/07"> 
    <rewrites> 
     <add name="catalog" virtualUrl="^~/catalog/(.*)/(.*).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/catalog.aspx?cid=$1&amp;c=$2" ignoreCase="true"/> 
    </rewrites> 
</urlrewritingnet> 

Sur la page J'ai un DataList avec 2 asp: boutons à l'intérieur. Lorsque vous cliquez dessus, la page est actualisée mais ne fait rien.

J'ai suivi ScottGu's article pour implémenter un adaptateur de contrôle de formulaire pour réécrire l'action du formulaire afin qu'il corresponde à l'URL réécrite.

URL de la page dans le navigateur: http://...../dev/catalog/13/Music.aspx

<form name="aspnetForm" method="post" action="/dev/catalog/13/Music.aspx" id="aspnetForm"> 

Je vois maintenant l'URL correcte sur l'action de la forme, et lors du débogage je peux voir le tir de l'événement de chargement de la page. Le problème est maintenant que chaque fois que la page charge Page.IsPostback est false, entraînant la page à relier la DataList et donc à ignorer la commande Item, les boutons doivent être déclenchés.

if (!Page.IsPostBack) 
    PopulateControls(); 

J'utilise .NET 3.5 SP1, il y a une ScriptManager sur la page principale, mais pas UpdatePanel sur cette page. J'ai également essayé de réinitialiser la propriété Form.Action et de contourner la solution de ScottGu avec le même résultat. Si je vais directement à l'URL de la page sans utiliser le réécriteur, tout fonctionne correctement.

Qu'est-ce qui me manque?

+0

Des suggestions? Je suis toujours coincé. Merci! – Sammy

Répondre

0

La persistance est payante. Il s'avère que le problème était le code suivant sur la page principale:

<asp:LinkButton runat="server" PostBackUrl="~/basket.aspx" Text="View Cart" CausesValidation="false" /> 

j'ai remplacé que par une étiquette <a> standard et tout fonctionne très bien.

NO IDÉE pourquoi cela ferait une différence ici. Je suppose que lors de la réécriture d'URL n'importe quel PostBackUrl ou NavigateUrls cassera les publications.

2

C'est le problème LinkButton, tout le linkbutton devrait retirer de la page inclure la page maître.

0

Sammy a raison. Je passe comme 5 heures jusqu'à trouver un problème. J'ai lu de nombreux articles sur "ASP.NET Url Re-Writing and Postback Problem" pour trouver le problème. Vous n'avez pas besoin de solutions telles que: http://weblogs.asp.net/jezell/archive/2004/03/15/90045.aspx et ils ne travaillent pas aussi ...

SOLUTION EST: Vous pouvez utiliser asp: LinkButton, asp: Button, asp: ImageButton MAIS NE REGLER leur de PostBackUrl. Utilisez simplement la balise <a> à la place de linkbutton.

0

Cela a troublé mon esprit pendant 4 heures d'affilée.

La réponse que j'ai utilisée était en fait la suppression de tous les postbackurl et des navigateurs.

Tout le reste a échoué, mais cela a fonctionné comme un charme.Vraiment vraiment fou comment c'était le problème mais c'est.

0

J'ai rencontré le même problème - UrlRewriter et la valeur de publication d'un bouton étant toujours faux. (pas de LinkButtons avec PostBackUrl spécifié)

J'ai ajouté FormControlAdapter de ScottGu et cela a fonctionné pour moi - CEPENDANT - après un certain temps j'ai remarqué que mes temps de chargement souffraient VRAIMENT. J'ai finalement suivi jusqu'à l'événement base.Render(new RewriteFormHtmlTextWriter(writer)); dans le FormControlAdapter, ce qui prend parfois plus de 5 secondes pour terminer.

Si j'ai supprimé le FormControlAdapter de mon fichier .browser, le bouton de la page d'accueil ne serait plus correctement publié (toujours faux).

Sur ma page d'accueil la balise form a été rendu à obtenir une action vide attribut <form action="" >

Dans ma situation, le bouton en question est sur ma page principale. En définissant manuellement l'action du formulaire dans l'événement Page_Load de mon MasterPage (dans mon cas à "default.aspx"), j'ai pu supprimer le FormControlAdapter et le bouton affiche correctement.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.RawUrl == "/" || Request.RawUrl == "/default.aspx") 
     form1.Action = "default.aspx"; 
    else 
     form1.Action = Request.RawUrl; 

Donc, il semble que tout ce qui est vraiment nécessaire est de définir le formulaire Action. La solution de ScottGu est fine et flexible, mais semble vraiment lente

Questions connexes