URL 쿼리에 대한 이름 값 모음?
내가 할 수 있다는 걸 알아요
var nv = HttpUtility.ParseQueryString(req.RawUrl);
하지만 이것을 다시 URL로 변환할 수 있는 방법이 있습니까?
var newUrl = HttpUtility.Something("/page", nv);
간단히 전화하기ToString()
에서NameValueCollection
이름 값 쌍을 반환합니다.name1=value1&name2=value2
쿼리 문자열 준비 형식입니다.참고:NameValueCollection
유형은 실제로 이를 지원하지 않으며 이를 제안하는 것은 오해의 소지가 있지만 아래 설명과 같이 실제로 반환된 내부 유형으로 인해 동작이 작동합니다.
@mjwills에게 감사합니다.HttpUtility.ParseQueryString
메소드는 실제로 내부를 반환합니다.HttpValueCollection
정칙이 아닌 목적어NameValueCollection
(지정된 설명서 참조).그HttpValueCollection
를 사용할 때 쿼리 문자열을 자동으로 인코딩합니다.ToString()
그래서 컬렉션을 순환하고 사용하는 루틴을 작성할 필요가 없습니다.UrlEncode
방법.원하는 결과가 이미 반환되었습니다.
그런 다음 결과를 URL에 추가하고 리디렉션할 수 있습니다.
var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
string url = Request.Url.AbsolutePath + "?" + nameValues.ToString();
Response.Redirect(url);
현재 사용할 수 있는 유일한 방법은HttpValueCollection
를 사용하는 것입니다.ParseQueryString
위에 표시된 방법(물론 반사 제외).이 클래스를 공개하도록 요청하는 Connect 문제가 "Wonn't fix" 상태로 닫혔기 때문에 변경되지 않을 것으로 보입니다.
별도로, 당신은 전화할 수 있습니다.Add
,Set
,그리고.Remove
에 대한 방법.nameValues
추가하기 전에 쿼리 문자열 항목을 수정합니다.만약 당신이 그것에 관심이 있다면 다른 질문에 대한 나의 대답을 보세요.
string q = String.Join("&",
nvc.AllKeys.Select(a => a + "=" + HttpUtility.UrlEncode(nvc[a])));
몇 개의 루프를 사용하는 확장 방법을 만듭니다.이 솔루션은 읽기 쉽고(linq 없음) 시스템이 필요 없기 때문에 선호합니다.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-parse 문자열로 컬렉션을 분석한 다음 컬렉션으로 다시 구문 분석합니다.
이 기법은 확장 방법으로도 노출될 수 있습니다.
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])}"));
냐하면.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)
);
})
);
아니면 린크를 그렇게 좋아하지 않는다면요
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
입니다.HttpValueCollection
"는 "아니오"입니다.NameValueCollection
보다는. 문자 그대로의 질문보다는.
업데이트: 주석에서 null 값 문제를 해결했습니다.
은 간한대다같음습다니과은답단다같니습▁use▁the▁to를 사용하는 것입니다..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());
이 url url 문자열을 분석하려고 , 문자열은 url 문자열입니다.Request
use use 사용어목Uri
리고그고.HttpUtility.ParseQueryString
방법.
Uri uri = new Uri("<THE URL>");
var nv = HttpUtility.ParseQueryString(uri.Query);
string url = String.Format("{0}?{1}", uri.AbsolutePath, nv.ToString());
나는 항상 UriBuilder를 사용하여 쿼리 문자열이 있는 URL을 유효하고 적절하게 인코딩된 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
AspNet Core 2.0에서는 QueryHelpers AddQueryString 메서드를 사용할 수 있습니다.
@Attchutchuk이 제안한 것처럼 QueryHelper를 사용할 수 있습니다.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('?');
}
이것은 저에게 효과가 있었습니다.
public ActionResult SetLanguage(string language = "fr_FR")
{
Request.UrlReferrer.TryReadQueryAs(out RouteValueDictionary parameters);
parameters["language"] = language;
return RedirectToAction("Index", parameters);
}
사용할 수 있습니다.
var ur = new Uri("/page",UriKind.Relative);
이 nv가 문자열 유형인 경우 uri 첫 번째 매개 변수에 추가할 수 있습니다.맘에 들다
var ur2 = new Uri("/page?"+nv.ToString(),UriKind.Relative);
언급URL : https://stackoverflow.com/questions/3865975/namevaluecollection-to-url-query
'programing' 카테고리의 다른 글
상태 변경 시 믹스인을 사용하여 차트를 업데이트하는 방법은 무엇입니까? (0) | 2023.07.04 |
---|---|
메시지가 수신되었을 때 Android의 Firebase Messaging이 갑자기 중단되기 시작했습니다. (0) | 2023.07.04 |
Firestore 쿼리 하위 컬렉션 (0) | 2023.07.04 |
데이터 프레임을 s3 Python에 직접 csv에 저장 (0) | 2023.07.04 |
Git 별칭 - 여러 명령 및 매개 변수 (0) | 2023.07.04 |