리디렉션을 위해 쿼리 문자열에서 항목을 제거하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/51964

  •  09-06-2019
  •  | 
  •  

문제

내 기본 페이지의 쿼리 문자열에서 항목을 제거하고 리디렉션해야 합니다.사용할 수 없습니다

Request.QueryString.Remove("foo")

컬렉션이 읽기 전용이기 때문입니다.컬렉션을 반복하고 다시 작성하지 않고 쿼리 문자열(해당 항목 제외)을 얻을 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

URL을 재구성한 다음 리디렉션해야 합니다.이 같은:

string url = Request.RawUrl;

NameValueCollection params = Request.QueryString;
for (int i=0; i<params.Count; i++)
{
    if (params[i].GetKey(i).ToLower() == "foo")
    {
        url += string.Concat((i==0 ? "?" : "&"), params[i].GetKey(i), "=", params.Get(i));
    }
}
Response.Redirect(url);

어쨌든, 나는 그런 것이나 아무것도 테스트하지 않았지만 작동할 것입니다(또는 적어도 당신이 올바른 방향으로 나아갈 수 있도록)

다른 팁

대신 복사본을 작업하여 원래 쿼리 문자열을 건드리지 않도록 할 수 있습니다.그런 다음 다음과 같이 수정된 쿼리 문자열이 포함된 URL로 페이지를 리디렉션할 수 있습니다.

    var nvc = new NameValueCollection();

    nvc.Add(HttpUtility.ParseQueryString(Request.Url.Query));

    nvc.Remove("foo");

    string url = Request.Url.AbsolutePath;

    for (int i = 0; i < nvc.Count; i++)
        url += string.Format("{0}{1}={2}", (i == 0 ? "?" : "&"), nvc.Keys[i], nvc[i]);

    Response.Redirect(url);

업데이트:

다음과 같이 코드를 단순화할 수 있습니다.

    var nvc = HttpUtility.ParseQueryString(Request.Url.Query);

    nvc.Remove("foo");

    string url = Request.Url.AbsolutePath + "?" + nvc.ToString();

    Response.Redirect(url);
Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));

나는 빠르게 해킹하여 비용을 거의 절약하지 못합니다.그러나 nextpge.aspx에서 대기 중인 코드에는 foo가 존재하지 않습니다. :)

흥미로운 질문입니다.이후 컬렉션을 수동으로 복사하는 것보다 실제 실행 가능한 대안이 보이지 않습니다. 에게 복사 (키가 아닌) 값만 얻을 수 있습니다.

제 생각에는 HollyStyles의 해킹 작동할 것입니다(비록 QueryString에 교체를 넣는 것에 대해 긴장할 수도 있지만 - obv.사용 사례에 따라 다름) 그러나 나를 괴롭히는 한 가지가 있습니다..

대상 페이지가 페이지를 읽지 않는 경우 QueryString에서 이를 제거해야 하는 이유는 무엇입니까?

그냥 무시될까요?

실패한다면, 총력을 다해 컬렉션을 변경하는 util 메소드를 생성하면 될 것 같습니다.

업데이트 - OP의 응답에 따름

아아아!이제 알겠습니다. 문자열의 전체 비교를 수행하는 SiteMap과 비슷한 문제가 있었습니다.

다른 소스 코드를 변경한 이후(예:검색)에 대해서는 의문의 여지가 없습니다. 아마도 문자열에 대해 바꾸기를 수행하는 것이 가장 좋을 것이라고 말하고 싶습니다.공평하게 말하면, 이와 유사한 코드가 자주 발생하는 경우 컬렉션을 복제하고 컬렉션에서 필터링할 값 배열을 가져오는 유틸리티 함수를 설정하는 것도 마찬가지로 빠릅니다.

이렇게 하면 다시는 그러한 문제에 대해 걱정할 필요가 없습니다 :)

HttpUtility.ParseQueryString(Request.Url.Query) 반품은QueryStringValueCollection.다음에서 상속됩니다. NameValueCollection.

    var qs = HttpUtility.ParseQueryString(Request.Url.Query);
    qs.Remove("foo"); 

    string url = "~/Default.aspx"; 
    if (qs.Count > 0)
       url = url + "?" + qs.ToString();

    Response.Redirect(url); 

검색 페이지는 강조 표시를 위해 쿼리 문자열에 "& order ="를 추가하므로 엉망이됩니다.

다른 옵션은 정규식 대체입니다.만약 너라면 확실히 알아라 &terms가 컬렉션 중간 어딘가에 있으면 정규식에 후행 &를 남겨두세요. 확실히 알아라 끝에 있으면 후행 &를 삭제하고 대체 문자열 "&"를 String.Empty로 변경합니다.

Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));

Request.Url.GetLeftPart(UriPartial.Path) 이렇게 해야 해

나는 이것이 더 우아한 해결책이라는 것을 알았습니다

var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString());

다음은 LINQ를 사용하는 솔루션입니다. Request.QueryString 필요한 경우 qs 매개변수의 복잡한 필터링이 가능합니다.

아래 예에서는 uid param을 사용하여 리디렉션할 준비가 된 상대 URL을 만듭니다.

전에: http://www.domain.com/home.aspx?color=red&uid=1&name=bob

후에: ~/home.aspx?color=red&name=bob

URL에서 QS 매개변수 제거

var rq = this.Request.QueryString;
var qs = string.Join("&", rq.Cast<string>().Where(k => k != "uid").Select(k => string.Format("{0}={1}", k, rq[k])).ToArray());
var url = string.Concat("~", Request.RawUrl.Split('?')[0], "?", qs);

컬렉션을 복제한 다음 복제된(및 수정된) 컬렉션이 있는 페이지로 리디렉션할 수 있습니까?

반복하는 것보다 낫지 않다는 것을 알고 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top