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.QueryStringurl-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[]=val2bkey1=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.ParseQueryStringRequest.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 |