2012-02-08 6 views
10

Estoy trabajando en un problema aparentemente simple: en mi filtro de Autorización estoy buscando algunas cosas si una de las condiciones no se cumple, necesito eliminar ciertos valores de la cadena de consulta y redirigir al usuario a la URL resultante. Sin embargo, esto me está dando algunos problemas más de los que me gustaría. Se ve algo como esto:Eliminar un valor de querystring en MVC3 y redirigir a la URL resultante

public void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (!SomeCondition()) { 
     RedirectToCleanUrl(filterContext); 
    } 
} 

En mi RedirectToCleanUrl Me desnudo las cadenas de consulta e intentar volver a dirigir a la nueva URL. Se ve así:

private void RedirectToCleanUrl(AuthorizationContext filterContext) 
{ 
    var queryStringParams = new NameValueCollection(filterContext.HttpContext.Request.QueryString); 

    // Stripping the key 
    queryStringParams.Remove("some_key"); 

    var routeValueDictionary = new RouteValueDictionary(); 

    foreach (string x in queryStringParams) 
    { 
     routeValueDictionary.Add(x, queryStringParams[x]); 
    } 

    foreach (var x in filterContext.RouteData.Values) 
    { 
     routeValueDictionary.Add(x.Key, x.Value); 
    } 

    filterContext.Result = new RedirectToRouteResult(routeValueDictionary); 
} 

En primer lugar, no funciona, e incluso si lo hizo, es feo. Debe haber una mejor manera, ¿verdad? ¿Que me estoy perdiendo aqui?

Respuesta

7

Aquí está el código que terminé escribiendo:

protected void StripQueryStringAndRedirect(System.Web.HttpContextBase httpContext, string[] keysToRemove) 
{ 
    var queryString = new NameValueCollection(httpContext.Request.QueryString); 

    foreach (var key in keysToRemove) 
    { 
     queryString.Remove(key); 
    } 

    var newQueryString = ""; 

    for (var i = 0; i < queryString.Count; i++) 
    { 
     if (i > 0) newQueryString += "&"; 
     newQueryString += queryString.GetKey(i) + "=" + queryString[i]; 
    } 

    var newPath = httpContext.Request.Path + (!String.IsNullOrEmpty(newQueryString) ? "?" + newQueryString : String.Empty); 

    if (httpContext.Request.Url.PathAndQuery != newPath) 
    { 
     httpContext.Response.Redirect(newPath, true); 
    } 
} 

También puede ser que desee urlencode los parametros de cadena de consulta, pero voy a dejar esto depende de usted.

Cuestiones relacionadas