¿Cómo puedo eliminar el elemento de querystring en asp.net usando c #?

Quiero eliminar la cadena de consulta de “Idioma” de mi url. Cómo puedo hacer esto ? (usando Asp.net 3.5, c #)

Default.aspx?Agent=10&Language=2 

Quiero eliminar “Idioma = 2”, pero el idioma sería el primero, el medio o el último. entonces tendré esto

 Default.aspx?Agent=20 

Respondí una pregunta similar hace un tiempo. Básicamente, la mejor manera sería usar la clase HttpValueCollection , que realmente es la propiedad QueryString , desafortunadamente es interna en .NET Framework. Podría usar Reflector para tomarlo (y colocarlo en su clase de Utils). De esta forma, podría manipular la cadena de consulta como NameValueCollection, pero con todos los problemas de encoding / deencoding de url que se preocupan por usted.

HttpValueCollection extiende NameValueCollection , y tiene un constructor que toma una cadena de consulta codificada (signos de unión y signos de interrogación incluidos), y reemplaza un método ToString() para luego reconstruir la cadena de consulta de la colección subyacente.

Si se trata de HttpRequest.QueryString, puede copiar la colección en una colección editable y salirse con la suya.

 NameValueCollection filtered = new NameValueCollection(request.QueryString); filtered.Remove("Language"); 

Aquí hay una manera simple. Reflector no es necesario

  public static string GetQueryStringWithOutParameter(string parameter) { var nameValueCollection = System.Web.HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString()); nameValueCollection.Remove(parameter); string url = HttpContext.Current.Request.Path + "?" + nameValueCollection; return url; } 

Aquí se requiere QueryString.ToString() porque la colección Request.QueryString es de solo lectura.

Finalmente,

La respuesta de hmemcpy fue totalmente para mí y gracias a otros amigos que respondieron.

Agarro el HttpValueCollection utilizando Reflector y escribí el siguiente código

  var hebe = new HttpValueCollection(); hebe.Add(HttpUtility.ParseQueryString(Request.Url.Query)); if (!string.IsNullOrEmpty(hebe["Language"])) hebe.Remove("Language"); Response.Redirect(Request.Url.AbsolutePath + "?" + hebe ); 

Mi preferencia personal aquí es volver a escribir la consulta o trabajar con una colección de valores de nombres en un punto inferior, pero hay momentos en los que la lógica empresarial hace que ninguno de estos sea muy útil y, en ocasiones, la reflexión es realmente lo que necesita. En esas circunstancias, puede apagar la bandera de solo lectura por un momento como ese:

 // reflect to readonly property 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("foo"); // modify this.Request.QueryString.Set("bar", "123"); // make collection readonly again isreadonly.SetValue(this.Request.QueryString, true, null); 

Prueba esto …

 PropertyInfo isreadonly =typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); isreadonly.SetValue(this.Request.QueryString, false, null); this.Request.QueryString.Remove("foo"); 

No deja en claro si está intentando modificar la Querystring en el objeto Request. Dado que esa propiedad es de solo lectura, supongo que asumiremos que solo quieres jugar con la cadena.

… En cuyo caso, es limítrofe trivial.

  • tomar la cadena de consulta de la Solicitud
  • .split () en ‘&’
  • vuélvala a juntar en una nueva cuerda, mientras olfatea y tira cualquier cosa que comience con “lenguaje”

Obtenga la colección querystring, analícela en una cadena ( name=value pair ), excluyendo la que desea QUITAR, y asígnele el nombre newQueryString

Luego, llame a Response.Redirect(known_path?newqueryString) ;

  1. Reúna su cadena de consulta utilizando HttpContext.Request.QueryString . Se predetermina como un tipo NameValueCollection .
  2. Empléelo como una cadena y use System.Web.HttpUtility.ParseQueryString() para analizar la cadena de consulta (que devuelve NameValueCollection nuevamente).
  3. A continuación, puede usar la función Remove() para eliminar el parámetro específico (usando la tecla para hacer referencia a ese parámetro para eliminar).
  4. Utilice el caso de los parámetros de consulta de nuevo en una cadena y use string.Join() para formatear la cadena de consulta como algo legible por su URL como parámetros de consulta válidos.

Vea a continuación un ejemplo de trabajo, donde param_to_remove es el parámetro que desea eliminar.

Digamos que sus parámetros de consulta son param1=1&param_to_remove=stuff&param2=2 . Ejecute las siguientes líneas:

 var queryParams = System.Web.HttpUtility.ParseQueryString(HttpContext.Request.QueryString.ToString()); queryParams.Remove("param_to_remove"); string queryString = string.Join("&", queryParams.Cast().Select(e => e + "=" + queryParams[e])); 

Ahora su cadena de consulta debe ser param1=1&param2=2 .

Probablemente quiera usar una expresión regular para encontrar el parámetro que desea eliminar de la cadena de consulta, luego eliminarlo y redirigir el navegador al mismo archivo con su nueva cadena de consulta.

Sí, no hay clases integradas en .NET para editar cadenas de consulta. Tendrás que usar Regex u otro método para alterar la cadena.

Si ya tiene la cadena de consulta como una cadena, también puede usar la manipulación simple de cadenas:

 int pos = queryString.ToLower().IndexOf("parameter="); if (pos >= 0) { int pos_end = queryString.IndexOf("&", pos); if (pos_end >= 0) // there are additional parameters after this one queryString = queryString.Substring(0, pos) + queryString.Substring(pos_end + 1); else if (pos == 0) // this one is the only parameter queryString = ""; else // this one is the last parameter queryString=queryString.Substring(0, pos - 1); } 
 string queryString = "Default.aspx?Agent=10&Language=2"; //Request.QueryString.ToString(); string parameterToRemove="Language"; //parameter which we want to remove string regex=string.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove); string finalQS = Regex.Replace(queryString, regex, ""); 

https://regexr.com/3i9vj

bueno, tengo una solución simple, pero hay un poco de javascript involucrado.

suponiendo que Query String es “ok = 1”

  string url = Request.Url.AbsoluteUri.Replace("&ok=1", ""); url = Request.Url.AbsoluteUri.Replace("?ok=1", ""); Response.Write("");