URL 쿼리에 대한 NameValueCollection?
할 수 있다는 걸 알아
var nv = HttpUtility.ParseQueryString(req.RawUrl);
그러나 이것을 URL로 다시 변환하는 방법이 있습니까?
var newUrl = HttpUtility.Something("/page", nv);
간단하게 호출 ToString()
온 NameValueCollection
A의 이름 값 쌍을 반환합니다 name1=value1&name2=value2
쿼리 문자열 준비 형식입니다. 참고 NameValueCollection
유형이 실제로이 기능을 지원하지 않고는이 제안하는 오해,하지만 행동으로 인해 아래에 설명 된대로 실제로 반환 된 내부 형식으로 여기에 작동합니다.
HttpUtility.ParseQueryString
메서드가 실제로 HttpValueCollection
일반 개체가 아닌 내부 개체를 반환 한다는 점을 지적한 @mjwills에게 감사합니다 NameValueCollection
( 문서 지정에도 불구하고NameValueCollection
). 는 HttpValueCollection
사용할 때 자동으로 쿼리 문자열을 암호화 ToString()
하므로 컬렉션을 루프가 사용하는 루틴을 쓸 필요가 없습니다 UrlEncode
방법은. 원하는 결과가 이미 반환되었습니다.
결과를 가져 오면 URL에 추가하고 리디렉션 할 수 있습니다.
var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
string url = Request.Url.AbsolutePath + "?" + nameValues.ToString();
Response.Redirect(url);
현재 a를 사용하는 유일한 방법 HttpValueCollection
은 ParseQueryString
위에 표시된 방법을 사용하는 것입니다 (물론 반사 제외). 이 클래스를 공개하도록 요청 하는 Connect 문제 가 "수정되지 않음"상태로 종료되었으므로 변경되지 않는 것 같습니다 .
제쳐두고, 당신은 전화 수있는 것처럼 Add
, Set
그리고 Remove
에 방법 nameValues
을 추가하기 전에 쿼리 문자열 항목을 수정합니다. 관심이 있으시면 다른 질문에 대한 답변을 참조하십시오 .
string q = String.Join("&",
nvc.AllKeys.Select(a => a + "=" + HttpUtility.UrlEncode(nvc[a])));
두 개의 루프를 사용하는 확장 메서드를 만듭니다. 이 솔루션은 읽기 쉽고 (linq 없음) System.Web.HttpUtility가 필요하지 않으며 중복 키를 처리하기 때문에 선호합니다.
public static string ToQueryString(this NameValueCollection nvc)
{
if (nvc == null) return string.Empty;
StringBuilder sb = new StringBuilder();
foreach (string key in nvc.Keys)
{
if (string.IsNullOrWhiteSpace(key)) continue;
string[] values = nvc.GetValues(key);
if (values == null) continue;
foreach (string value in values)
{
sb.Append(sb.Length == 0 ? "?" : "&");
sb.AppendFormat("{0}={1}", Uri.EscapeDataString(key), Uri.EscapeDataString(value));
}
}
return sb.ToString();
}
예
var queryParams = new NameValueCollection()
{
{ "order_id", "0000" },
{ "item_id", "1111" },
{ "item_id", "2222" },
{ null, "skip entry with null key" },
{ "needs escaping", "special chars ? = &" },
{ "skip entry with null value", null }
};
Console.WriteLine(queryParams.ToQueryString());
산출
?order_id=0000&item_id=1111&item_id=2222&needs%20escaping=special%20chars%20%3F%20%3D%20%26
이것은 너무 많은 코드없이 작동합니다.
NameValueCollection nameValues = HttpUtility.ParseQueryString(String.Empty);
nameValues.Add(Request.QueryString);
// modify nameValues if desired
var newUrl = "/page?" + nameValues;
아이디어는 HttpUtility.ParseQueryString
유형의 빈 컬렉션을 생성하는 데 사용 하는 것입니다 HttpValueCollection
. 이 클래스는 코드가 인스턴스를 쉽게 만들 수 없도록 NameValueCollection
표시된 하위 클래스입니다 internal
.
좋은 점은 메서드가 인코딩을 처리 HttpValueCollection
한다는 ToString
것입니다. 이 NameValueCollection.Add(NameValueCollection)
메서드 를 활용하면 Request.QueryString
컬렉션을 URL 인코딩 된 문자열로 먼저 변환 한 다음 다시 컬렉션으로 구문 분석 하지 않고도 새로 생성 된 개체에 기존 쿼리 문자열 매개 변수를 추가 할 수 있습니다 .
이 기술은 확장 방법으로도 노출 될 수 있습니다.
public static string ToQueryString(this NameValueCollection nameValueCollection)
{
NameValueCollection httpValueCollection = HttpUtility.ParseQueryString(String.Empty)
httpValueCollection.Add(nameValueCollection);
return httpValueCollection.ToString();
}
실제로 값뿐만 아니라 키도 인코딩해야합니다.
string q = String.Join("&",
nvc.AllKeys.Select(a => $"{HttpUtility.UrlEncode(a)}={HttpUtility.UrlEncode(nvc[a])}"));
짧은 대답은 사용하는 것입니다 .ToString()
온 NameValueCollection
원래의 URL와 결합.
그러나 몇 가지를 지적하고 싶습니다.
당신은 사용하지 못할 HttpUtility.ParseQueryString
에 Request.RawUrl
. ParseQueryString()
방법은이 같은 값을 찾고있다 : ?var=value&var2=value2
.
매개 변수 NameValueCollection
중 하나를 얻으려면 .QueryString
Request.QueryString()
var nv = Request.QueryString;
URL을 다시 작성하려면 nv.ToString ()을 사용하십시오.
string url = String.Format("{0}?{1}", Request.Path, nv.ToString());
Request
객체 사용 Uri
및 HttpUtility.ParseQueryString
방법 을 사용하는 대신 URL 문자열을 구문 분석하려는 경우 .
Uri uri = new Uri("<THE URL>");
var nv = HttpUtility.ParseQueryString(uri.Query);
string url = String.Format("{0}?{1}", uri.AbsolutePath, nv.ToString());
a NameValueCollection
는 동일한 키에 대해 여러 값을 가질 수 있기 때문에 쿼리 문자열의 형식에 관심이있는 경우 ( "배열 표기법"이 아닌 쉼표로 구분 된 값으로 반환되므로) 다음을 고려할 수 있습니다.
예
var nvc = new NameValueCollection();
nvc.Add("key1", "val1");
nvc.Add("key2", "val2");
nvc.Add("empty", null);
nvc.Add("key2", "val2b");
로 바꾸십시오 : key1=val1&key2[]=val2&empty&key2[]=val2b
보다는 key1=val1&key2=val2,val2b&empty
.
암호
string qs = string.Join("&",
// "loop" the keys
nvc.AllKeys.SelectMany(k => {
// "loop" the values
var values = nvc.GetValues(k);
if(values == null) return new[]{ k };
return nvc.GetValues(k).Select( (v,i) =>
// 'gracefully' handle formatting
// when there's 1 or more values
string.Format(
values.Length > 1
// pick your array format: k[i]=v or k[]=v, etc
? "{0}[]={1}"
: "{0}={1}"
, k, HttpUtility.UrlEncode(v), i)
);
})
);
아니면 Linq를별로 좋아하지 않는다면 ...
string qs = nvc.ToQueryString(); // using...
public static class UrlExtensions {
public static string ToQueryString(this NameValueCollection nvc) {
return string.Join("&", nvc.GetUrlList());
}
public static IEnumerable<string> GetUrlList(this NameValueCollection nvc) {
foreach(var k in nvc.AllKeys) {
var values = nvc.GetValues(k);
if(values == null) { yield return k; continue; }
for(int i = 0; i < values.Length; i++) {
yield return
// 'gracefully' handle formatting
// when there's 1 or more values
string.Format(
values.Length > 1
// pick your array format: k[i]=v or k[]=v, etc
? "{0}[]={1}"
: "{0}={1}"
, k, HttpUtility.UrlEncode(values[i]), i);
}
}
}
}
이미 의견에서 지적 했듯이이 답변을 제외하고 대부분의 다른 답변 은 문자 질문이 아닌 시나리오 ( Request.QueryString
is an HttpValueCollection
, "not"a NameValueCollection
)를 다룹니다.
Update: addressed null value issue from comment.
Would this work for you?
public static string BuildUrl(string relativeUrl, params string[] queryString)
{
// build queryString from string parameters
char[] trimChars = { ' ', '&', '?' };
StringBuilder builder = new StringBuilder();
string sepChar = "&";
string sep = String.Empty;
foreach (string q in queryString)
{
builder.Append(sep).Append(q.Trim(trimChars));
sep = sepChar;
}
if (String.IsNullOrEmpty(builder.ToString())) { return relativeUrl; }
else { return relativeUrl + "?" + builder.ToString(); }
}
Use:
string url = BuildUrl("/mypage.apsx", "qs1=a", "qs2=b", "qs3=c");
In AspNet Core 2.0 you can use QueryHelpers AddQueryString method.
You can use.
var ur = new Uri("/page",UriKind.Relative);
if this nv is of type string you can append to the uri first parameter. Like
var ur2 = new Uri("/page?"+nv.ToString(),UriKind.Relative);
I always use UriBuilder to convert an url with a querystring back to a valid and properly encoded url.
var url = "http://my-link.com?foo=bar";
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query.Add("yep", "foo&bar");
uriBuilder.Query = query.ToString();
var result = uriBuilder.ToString();
// http://my-link.com:80/?foo=bar&yep=foo%26bar
As @Atchitutchuk suggested, you can use QueryHelpers.AddQueryString in ASP.NET Core:
public string FormatParameters(NameValueCollection parameters)
{
var queryString = "";
foreach (var key in parameters.AllKeys)
{
foreach (var value in parameters.GetValues(key))
{
queryString = QueryHelpers.AddQueryString(queryString, key, value);
}
};
return queryString.TrimStart('?');
}
참고URL : https://stackoverflow.com/questions/3865975/namevaluecollection-to-url-query
'Program Tip' 카테고리의 다른 글
jQuery로 HTML 태그를 제거하는 방법은 무엇입니까? (0) | 2020.11.06 |
---|---|
이름에 Pandas DataFrame의 특정 문자열이 포함 된 열을 삭제합니다. (0) | 2020.11.06 |
Python 목록 반복을위한 시작 색인 (0) | 2020.11.06 |
JavaFX 2.0에서 공통 대화 상자 (오류, 경고, 확인)를 만들고 표시하는 방법은 무엇입니까? (0) | 2020.11.06 |
C ++ : 레지스터에 피연산자 하나를 유지하여 놀라운 속도 향상 (0) | 2020.11.05 |