2012-02-08 15 views
10

一見簡単な問題に取り組んでいます:私の認証フィルタで、条件の1つが満たされていない場合、私はいくつかをチェックしています。クエリ文字列から特定の値を削除し、結果のURLにユーザーをリダイレクトします。しかし、これは私が望むよりもいくつか問題が増えています。私は、クエリ文字列を除去し、新しいURLにリダイレクトしようとしてる私のRedirectToCleanUrlでMVC3のクエリ文字列から値を削除し、結果のURLにリダイレクト

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

:それは次のようになります。

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

最初にすべて消えてしまっても、醜いです。より良い方法が必要でしょう、そうですか?私はここで何が欠けていますか?ここで

答えて

7

は私が執筆を終わったコードです:

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

また、クエリ文字列のparamsをURLENCODEする場合がありますが、私はあなたにこれを残しておきます。

関連する問題