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.
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 .
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
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);
}
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"]
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"));
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.
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}
});
}
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");
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.
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
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