의 쿼리 문자열을 해석 및 변경합니다.NET 코어
쿼리 문자열을 포함하는 절대 URI가 지정되었습니다.쿼리 문자열에 값을 안전하게 추가하고 기존 매개 변수를 변경하려고 합니다.
붙이고 싶지 않다&foo=bar
또는 정규 표현을 사용하면 URI의 이스케이프가 어려워집니다.오히려 올바르게 동작하여 탈출을 처리할 수 있는 내장 메커니즘을 사용하고 싶습니다.
모든 사람이 사용하는 수많은 답을 찾아냈죠.HttpUtility
ASP하다NET Core, 시 net net net net net net net net net net net 。에 더 이상 웹 어셈블리가 필요 .HttpUtility
.
ASP에서 이를 수행하는 적절한 방법은 무엇입니까?NET Core는 코어 런타임에 타겟팅하고 있습니까?
ASP の asp asp asp 。은, 1 또는 NET Core 2 를 사용해 실행할 수 있습니다.Microsoft.AspNetCore.WebUtilities.QueryHelpers
를 참조해 주세요.AspNetCore.Web Utilities 패키지.
ASP の asp asp asp 。3.0 NET Core 3.0 ®WebUtilities
ASP를 사용하다NET SDK의 nuget.
사전으로 해석하려면:
var uri = new Uri(context.RedirectUri);
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);
, ''는 '''와 달리'''는 주의해 주세요.ParseQueryString
시스템에 있습니다. ,, 식사사aryaryaryaryaryaryaryaryaryaryaryary web의 합니다.IDictionary<string, string[]>
ASP の asp asp asp asp asp asp asp1. NET Core 1.x "IDictionary<string, StringValues>
ASP の asp asp asp asp asp asp aspNET Core 2.x 는 NET Core 2.x 에 대응하고 있습니다.사전은 이와 같이 동일한 이름의 여러 쿼리 문자열 매개 변수를 처리합니다.
문자열에 에 할 수 .QueryHelpers
:
var parametersToAdd = new System.Collections.Generic.Dictionary<string, string> { { "resource", "foo" } };
var someUrl = "http://www.google.com";
var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl, parametersToAdd);
.net core 2.2를 사용하면 쿼리 문자열을 얻을 수 있습니다.
var request = HttpContext.Request;
var query = request.Query;
foreach (var item in query){
Debug.WriteLine(item)
}
다음과 같은 키:값 쌍의 컬렉션을 얻을 수 있습니다.
[0] {[companyName, ]}
[1] {[shop, ]}
[2] {[breath, ]}
[3] {[hand, ]}
[4] {[eye, ]}
[5] {[firstAid, ]}
[6] {[eyeCleaner, ]}
ASP를 사용하여 절대 URI를 가져와 쿼리 문자열을 조작하는 가장 쉽고 직관적인 방법입니다.NET Core 패키지만, 다음의 몇개의 간단한 순서로 실행할 수 있습니다.
패키지 설치
Microsoft 의 인스톨 패키지.AspNetCore.웹 유틸리티
Microsoft 의 인스톨 패키지.AspNetCore.Http. 확장자
중요 클래스
이 두 가지 중요한 클래스는 다음과 같습니다.QueryHelpers, StringValues, QueryBuilder.
코드
// Raw URI including query string with multiple parameters
var rawurl = "https://bencull.com/some/path?key1=val1&key2=val2&key2=valdouble&key3=";
// Parse URI, and grab everything except the query string.
var uri = new Uri(rawurl);
var baseUri = uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.UriEscaped);
// Grab just the query string part
var query = QueryHelpers.ParseQuery(uri.Query);
// Convert the StringValues into a list of KeyValue Pairs to make it easier to manipulate
var items = query.SelectMany(x => x.Value, (col, value) => new KeyValuePair<string, string>(col.Key, value)).ToList();
// At this point you can remove items if you want
items.RemoveAll(x => x.Key == "key3"); // Remove all values for key
items.RemoveAll(x => x.Key == "key2" && x.Value == "val2"); // Remove specific value for key
// Use the QueryBuilder to add in new items in a safe way (handles multiples and empty values)
var qb = new QueryBuilder(items);
qb.Add("nonce", "testingnonce");
qb.Add("payerId", "pyr_");
// Reconstruct the original URL with new query string
var fullUri = baseUri + qb.ToQueryString();
변경에 대한 최신 정보는 이쪽에서 확인하실 수 있습니다.http://benjii.me/2017/04/parse-modify-query-strings-asp-net-core/
HttpRequest
가 있다Query
해석된 쿼리 문자열을 인터페이스를 통해 공개하는 속성:
/// <summary>
/// Gets the query value collection parsed from owin.RequestQueryString.
/// </summary>
/// <returns>The query value collection parsed from owin.RequestQueryString.</returns>
public abstract IReadableStringCollection Query { get; }
이 함수는 반환됩니다.Dictionary<string, string>
를 사용하지 않습니다.Microsoft.xxx
호환성을 위해
양쪽에서 파라미터 인코딩을 받아들입니다.
중복된 키를 받아들입니다(마지막 값 반환).
var rawurl = "https://emp.com/some/path?key1.name=a%20line%20with%3D&key2=val2&key2=valdouble&key3=&key%204=44#book1";
var uri = new Uri(rawurl);
Dictionary<string, string> queryString = ParseQueryString(uri.Query);
// queryString return:
// key1.name, a line with=
// key2, valdouble
// key3,
// key 4, 44
public Dictionary<string, string> ParseQueryString(string requestQueryString)
{
Dictionary<string, string> rc = new Dictionary<string, string>();
string[] ar1 = requestQueryString.Split(new char[] { '&', '?' });
foreach (string row in ar1)
{
if (string.IsNullOrEmpty(row)) continue;
int index = row.IndexOf('=');
if (index < 0) continue;
rc[Uri.UnescapeDataString(row.Substring(0, index))] = Uri.UnescapeDataString(row.Substring(index + 1)); // use Unescape only parts
}
return rc;
}
중요한 점은 상위 답변이 정답으로 플래그가 지정된 이후 다음 사항을 참조하십시오.Microsoft.AspNetCore.WebUtilities
에 메이저 버전업데이트가 있습니다(1.x.x에서 2.x.x로).
그렇긴 하지만, 만약 당신이 이 빌딩을 건설한다면netcoreapp1.1
지원되는 최신 버전을 설치하는 다음 작업을 수행해야 합니다.1.1.2
:
Install-Package Microsoft.AspNetCore.WebUtilities -Version 1.1.2
확장 방법으로서 이것을 사용하고, 임의의 수의 파라메타로 동작합니다.
public static string AddOrReplaceQueryParameter(this HttpContext c, params string[] nameValues)
{
if (nameValues.Length%2!=0)
{
throw new Exception("nameValues: has more parameters then values or more values then parameters");
}
var qps = new Dictionary<string, StringValues>();
for (int i = 0; i < nameValues.Length; i+=2)
{
qps.Add(nameValues[i], nameValues[i + 1]);
}
return c.AddOrReplaceQueryParameters(qps);
}
public static string AddOrReplaceQueryParameters(this HttpContext c, Dictionary<string,StringValues> pvs)
{
var request = c.Request;
UriBuilder uriBuilder = new UriBuilder
{
Scheme = request.Scheme,
Host = request.Host.Host,
Port = request.Host.Port ?? 0,
Path = request.Path.ToString(),
Query = request.QueryString.ToString()
};
var queryParams = QueryHelpers.ParseQuery(uriBuilder.Query);
foreach (var (p,v) in pvs)
{
queryParams.Remove(p);
queryParams.Add(p, v);
}
uriBuilder.Query = "";
var allQPs = queryParams.ToDictionary(k => k.Key, k => k.Value.ToString());
var url = QueryHelpers.AddQueryString(uriBuilder.ToString(),allQPs);
return url;
}
예를 들어 뷰의 다음 링크 및 프리브링크:
var next = Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex+1+"");
var prev = Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex-1+"");
어느 시점에서 추가되었는지는 알 수 없지만 빠르면 그렇게 됩니다.NET Core 3.1HttpUtility.ParseQueryString
사용할 수 있으며 표준에 포함되어 있습니다.그물Microsoft.NETCore.App
를 참조할 수 있습니다.추가 NuGet 패키지나 특별한 dll 참조 없이 클래스 라이브러리에서 액세스할 수 있었습니다.
에서 테스트했습니다.NET Core 3.1, .NET 6 및.NET 7 。
이 접근방식의 장점은 ASP 컨텍스트 밖에서 사용할 수 있는 라이브러리를 구축하는 경우 프로젝트에 추가되는 웹 라이브러리를 참조할 필요가 없다는 것입니다.그물.
물론 ASP 내에서 이것이 필요한 경우입니다.NET Core 앱,Microsoft.AspNetCore.WebUtilities
다른 사람들이 제안한 수업은 완벽하게 유효하다.
편집: @KTCO는 2017년 OP에 대한 코멘트에서 이 클래스가 에서 사용 가능하다고 지적했습니다.NET Core 2.0도 마찬가지입니다.
언급URL : https://stackoverflow.com/questions/29992848/parse-and-modify-a-query-string-in-net-core
'programing' 카테고리의 다른 글
Swift에서 개체의 클래스 이름을 문자열로 가져옵니다. (0) | 2023.04.21 |
---|---|
Bash에서의 do-while 루프 에뮬레이트 (0) | 2023.04.21 |
게시하는 동안 웹 앱을 오프라인으로 전환하려면 어떻게 해야 합니까? (0) | 2023.04.21 |
VBA가 If-statement에서 잘못된 분기를 사용 - 심각한 컴파일러 버그? (0) | 2023.04.21 |
varchar와 nvarchar SQL Server 데이터 유형의 주요 성능 차이는 무엇입니까? (0) | 2023.04.21 |