2012-02-08 40 views
10

Tôi đang làm việc trên một vấn đề đơn giản: trong bộ lọc ủy quyền của tôi Tôi đang kiểm tra một vài điều nếu một trong các điều kiện không được đáp ứng, tôi cần xóa các giá trị nhất định khỏi chuỗi Truy vấn và chuyển hướng người dùng đến URL kết quả. Tuy nhiên, điều này là cho tôi một vài vấn đề hơn tôi muốn. Có vẻ như sau:Xóa giá trị khỏi chuỗi truy vấn trong MVC3 và chuyển hướng đến URL kết quả

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

Trong RedirectToCleanUrl, tôi đang xóa chuỗi truy vấn và chuyển hướng chúng đến url mới. Có vẻ như sau:

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

Trước hết, nó không hoạt động và ngay cả khi nó đã làm, nó xấu xí. Phải có một cách tốt hơn, phải không? Tôi đang thiếu gì ở đây?

Trả lời

7

Dưới đây là đoạn code tôi đã kết thúc viết:

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

Bạn cũng có thể muốn URLEncode params chuỗi truy vấn, nhưng tôi sẽ để lại này tùy thuộc vào bạn.

Các vấn đề liên quan