2012-02-08 16 views
10

Şu anda basit bir sorun üzerinde çalışıyorum: Yetkilendirme filtresimde koşullardan biri karşılanmadığı takdirde birkaç şey olup olmadığını kontrol ediyorum. Sorgu dizesindeki belirli değerleri kaldırın ve kullanıcıyı ilgili URL'ye yönlendirin. Ancak, bu bana istediğimden daha fazla sorun veriyor. Ben sorgu dizeleri sıyırma ve yeni url yönlendirmez girişiminde ediyorum benim RedirectToCleanUrl olarakMVC3'te querystring'den bir değeri kaldırın ve ortaya çıkan URL'ye yönlendirin

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

: Bu şuna benzer. Bu şuna benzer:

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); 
} 

Öncelikle tüm çalışmıyor ve yaptım bile, çirkin. Daha iyi bir yol olmalı, değil mi? Burada neyi özlüyorum?

cevap

7

Burada yazma sona erdi kod: Ayrıca sorgu dizesi params UrlEncode isteyebilirsiniz

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); 
    } 
} 

ama bunu telafi bırakacağım.

İlgili konular