web-dev-qa-db-fra.com

Comment mettre à jour la chaîne de requête en C #?

Quelque part dans l’url, il y a un & sortBy = 6. Comment puis-je mettre à jour ceci à & sortBy = 4 ou & sortBy = 2 sur un clic de bouton? Dois-je écrire des fonctions de chaîne personnalisées pour créer la bonne URL de redirection?

Si je dois juste ajouter une variable de chaîne de requête, je le ferais

string completeUrl = HttpContext.Current.Request.Url.AbsoluteUri + "&" + ...
Response.Redirect(completeUrl);

Mais ce que je veux faire, c'est modifier une variable de chaîne de requête existante. 

44
developer747

Pour modifier une valeur QueryString existante, utilisez cette approche:

var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
nameValues.Set("sortBy", "4");
string url = Request.Url.AbsolutePath;
Response.Redirect(url + "?" + nameValues); // ToString() is called implicitly

Je vais plus en détail dans une autre réponse .

117
Ahmad Mageed

Récupérez la chaîne de requête de sortby , puis exécutez string replace sur l’URL complète comme suit:

string sUrl = *retrieve the required complete url*
string sCurrentValue = Request.QueryString["sortby"];
sUrl = sUrl.Replace("&sortby=" + sCurrentValue, "&sortby=" + newvalue);

Faites-moi savoir comment ça se passe :)

Bonne chance

7
m.othman
    private void UpdateQueryString(string queryString, string value)
    {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        isreadonly.SetValue(this.Request.QueryString, false, null);
        this.Request.QueryString.Set(queryString, value);
        isreadonly.SetValue(this.Request.QueryString, true, null);
    }
5
Mathias Nohall

Si vous le souhaitez vraiment, vous devez rediriger vers la même page avec la chaîne de requête modifiée comme déjà répondu. Cela chargera à nouveau votre page, chargez-la à nouveau juste pour changer la chaîne de requête qui n'est pas une bonne pratique.

Mais pourquoi avez-vous besoin de cela?

Si vous voulez changer la valeur de sortBy de 6 à 4 pour l'utiliser partout dans l'application, je suggère de stocker la valeur de chaîne de requête dans une variable ou un état d'affichage et d'utiliser cet état d'affichage partout.

Par exemple.

dans Page_Load, vous pouvez écrire

if (!IsPostBack)
{
  ViewState["SortBy"] = Request.QueryString["sortBy"];
}

et partout ailleurs (même après publication), vous pouvez utiliser ViewState ["SortBy"]

2
Imran Rizvi

Basé sur la solution Ahmad, j'ai créé la méthode suivante qui peut être utilisée de manière générale

private string ModifyQueryStringValue(string p_Name, string p_NewValue)
{

    var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
    nameValues.Set(p_Name, p_NewValue);
    string url = Request.Url.AbsolutePath;
    string updatedQueryString = "?" + nameValues.ToString();
    return url + updatedQueryString;
}

et puis nous comme suit 

Response.Redirect(ModifyQueryStringValue("SortBy","4"));
1
user2832159

Vous pouvez le faire côté client avec du javascript pour construire la chaîne de requête et rediriger la page à l’aide de windows.open .

Sinon, vous pouvez utiliser Response.Redirect ou Server.Transfer sur le serveur.

0
Strillo

SolrNet a quelques méthodes d'extension d'URL très utiles. http://code.google.com/p/solrnet/source/browse/trunk/SampleSolrApp/Helpers/UrlHelperExtensions.cs?r=512

    /// <summary>
    /// Sets/changes an url's query string parameter.
    /// </summary>
    /// <param name="helper"></param>
    /// <param name="url">URL to process</param>
    /// <param name="key">Query string parameter key to set/change</param>
    /// <param name="value">Query string parameter value</param>
    /// <returns>Resulting URL</returns>
    public static string SetParameter(this UrlHelper helper, string url, string key, string value) {
        return helper.SetParameters(url, new Dictionary<string, object> {
            {key, value}
        });
    }
0
James Hull

Je pense que vous pourriez effectuer un remplacement de la chaîne de requête de la manière suivante sur votre code côté serveur.

NameValueCollection filtered = new NameValueCollection(request.QueryString);

filtered.Remove("SortBy");
filtered.Add("SortBy","4");
0
legrandviking

La chaîne de requête est transmise AU serveur. Vous pouvez traiter la chaîne de requête comme une chaîne à votre guise - mais cela ne fera rien tant que la page ne sera pas prête à la relire (c'est-à-dire renvoyée au serveur). Donc, si vous demandez comment traiter la valeur d'une chaîne de requête, vous y accédez simplement Request.QueryString ["key"]. Si vous souhaitez que le changement de chaîne de requête soit pris en compte par le serveur, il vous suffit de recharger efficacement la page avec la nouvelle valeur. Construisez donc à nouveau l'url page.aspx?id=30 par exemple et transmettez-le à une méthode de redirection.

0
SkonJeet

Vous devez rediriger vers une nouvelle URL. Si vous devez travailler sur le serveur avant de le rediriger, vous devez utiliser Response.Redirect (...) dans votre code. Si vous n’avez pas besoin de travailler sur le serveur, utilisez simplement HyperLink et rendez-le à l’avance.

Si vous posez des questions sur la construction de l'URL réelle, je ne suis au courant d'aucune fonction intégrée pouvant effectuer le travail. Vous pouvez utiliser des constantes pour vos arguments Paths et QueryString afin d'éviter de les répéter partout dans votre code.

Le UriBuilder peut vous aider à construire l'URL mais pas la chaîne de requête

0
Stilgar

La seule façon de changer la variable QueryString consiste à rediriger vers la même page avec le nouveau QueryString:

Response.Redirect("YourPage.aspx?&sortBy=4")

http://msdn.Microsoft.com/en-us/library/a8wa7sdt(v=vs.100).aspx

0