리디렉션을 위해 쿼리 문자열에서 항목을 제거하려면 어떻게 해야 합니까?
문제
내 기본 페이지의 쿼리 문자열에서 항목을 제거하고 리디렉션해야 합니다.사용할 수 없습니다
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);
컬렉션을 복제한 다음 복제된(및 수정된) 컬렉션이 있는 페이지로 리디렉션할 수 있습니까?
반복하는 것보다 낫지 않다는 것을 알고 있습니다 ...