2009-05-12 8 views
11

J'ai un formulaire qui est parfois lié à certains paramètres de chaîne de requête. Le problème est que lorsque je publie le formulaire, le paramètre de chaîne de requête est toujours là. Ce n'est pas vraiment un problème comme je l'ai configuré, mais je n'aime pas que ce soit là, et je pourrais voir que c'est un problème si vous deviez vérifier l'entrée dans un certain ordre.Existe-t-il un moyen d'effacer les paramètres de la chaîne de requête lors de la publication?

Existe-t-il un moyen d'effacer ce paramètre de chaîne de requête d'une manière facile et propre? Je sais que je pourrais changer le PostBackURL sur le bouton, mais cela ne semble pas trop efficace.

Répondre

12

Non, je n'ai pas vu un moyen de l'effacer sans une redirection.

+1

même ici. –

+0

Y a-t-il un moyen propre de faire un Response.Redirect() à la page que vous êtes actuellement? –

+3

Essayez: Response.Redirect (Request.CurrentExecutionFilePath()) – rvarcher

3

Vous pouvez dans certains cas utiliser la méthode Server.Transfer(), qui a une surcharge qui vous permet de spécifier si la chaîne de requête et les données de formulaire doivent être conservées ou non.

5

mettez ceci au bas de votre page?

<script language="javascript" type="text/javascript"> 
    document.forms[0].action = window.location.pathname; 
</script> 
+0

Ou à partir de code-behind: form1.Action = Request.Url.GetLeftPart (UriPartial.Path); – user764754

7

Je pense que vous avez répondu à votre propre question. Utilisez la propriété PostBackURL.

<asp:Button PostBackUrl='<%# Request.ServerVariables["URL"] %>' runat="server" Text="Submit" /> 

Ou quelque chose comme

foreach (Control ctrl in Page.Controls) 
{ 
    if (ctrl is Button) 
    { 
     ((Button)ctrl).PostBackUrl = Request.ServerVariables["URL"]; 
    } 
} 
3

Je suppose que vous ne pouvez pas compter sur Page.IsPostBack pour une raison quelconque? Si ce que vous faites est côté serveur, alors il est simple d'ajouter une vérification de IsPostBack dans vos méthodes (Page_Load, OnInit, etc.) et de ne traiter que les querystrings s'il ne s'agit pas d'un retour (ie la demande initiale).

3

Je viens de tomber sur le même problème et après une chasse sur le Web, je trouve cet extrait:

public void ClearQueryStrings() 
{ 
    string clientCommand = string.Format(
     "document.forms[\"{0}\"].action = \"{1}\";", 
     this.Form.Name, Request.Url.Segments[Request.Url.Segments.Length - 1]); 

    ClientScript.RegisterStartupScript(this.GetType(), "qr", clientCommand, true); 
} 

J'appelle ClearQueryStrings() dans mon Page_Load après que je suis fait traiter les paramètres de chaîne de requête d'origine. Lorsque la page affiche, les paramètres sont partis.

Original article is here.

-1
using System.Collections; 
using System.Reflection; 

Utilisez le code suivant pour supprimer les paramètres de chaîne de requête.

// To clear Query string value 
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 

// make collection editable 
isreadonly.SetValue(this.Request.QueryString, false, null); 

// remove 
this.Request.QueryString.Remove("YourQueryStringParameter"); 
4

J'ai été coincé avec le même problème.

Je l'ai résolu en utilisant le bloc de code suivant:

private void ClearQueryString() 
{ 
    PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
    isreadonly.SetValue(this.Request.QueryString, false, null); 
    this.Request.QueryString.Remove("Action"); 
    this.Request.QueryString.Remove("param1"); 
    this.Request.QueryString.Remove("paramN"); 
} 
0

Cette méthode n'est pas ce que vous appelleriez une redirection, mais il va certainement effacer la chaîne de requête. Ajoutez simplement cette ligne à la fin de votre code JavaScript:

window.location.search = ""; 

Ou

Ajoutez ceci à la fin de votre page HTML:

<script type="text/javascript"> 
    window.location.search = ""; 
</script> 

Selon l'endroit où vous insérez le code, le moment de l'effacement de la chaîne de requête va changer.

0
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
    // make collection editable 
isreadonly.SetValue(this.Request.QueryString, false, null); 
    // remove 

this.Request.QueryString.Remove("status"); 
+0

N'est-ce pas ce que la plupart des autres réponses suggèrent déjà? –

0

Vous pouvez essayer Response.Redirect(Request.CurrentExecutionFilePath()); Son travail pour moi.

Questions connexes