Parse and modify a query string in .NET Core
If you are using ASP.NET Core 1 or 2, you can do this with Microsoft.AspNetCore.WebUtilities.QueryHelpers
in the Microsoft.AspNetCore.WebUtilities package.
If you are using ASP.NET Core 3.0 or greater, WebUtilities
is now part of the ASP.NET SDK and does not require a separate nuget package reference.
To parse it into a dictionary:
var uri = new Uri(context.RedirectUri);
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);
Note that unlike ParseQueryString
in System.Web, this returns a dictionary of type IDictionary<string, string[]>
in ASP.NET Core 1.x, or IDictionary<string, StringValues>
in ASP.NET Core 2.x or greater, so the value is a collection of strings. This is how the dictionary handles multiple query string parameters with the same name.
If you want to add a parameter on to the query string, you can use another method on 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);
Using .net core 2.2 you can get the query string using
var request = HttpContext.Request;
var query = request.Query;
foreach (var item in query){
Debug.WriteLine(item)
}
You will get a collection of key:value pairs - like this
[0] {[companyName, ]}
[1] {[shop, ]}
[2] {[breath, ]}
[3] {[hand, ]}
[4] {[eye, ]}
[5] {[firstAid, ]}
[6] {[eyeCleaner, ]}
Need to modify Query Parameter before sending to API in core 2
In foreach
loop a collection is read-only you can't modify it.
You could copy ActionArguments
collection before iterating through it by calling ToList
:
foreach (KeyValuePair<string, object> parameter in context.ActionArguments.ToList())
{
context.ActionArguments[parameter.Key] = Security.Decrypt(parameter.Value.ToString());
}
How to parse a query string into a NameValueCollection in .NET
There's a built-in .NET utility for this: HttpUtility.ParseQueryString
// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
You may need to replace querystring
with new Uri(fullUrl).Query
.
Append values to query string
You could use the HttpUtility.ParseQueryString
method and an UriBuilder
which provides a nice way to work with query string parameters without worrying about things like parsing, URL encoding, ...:
string longurl = "http://somesite.example/news.php?article=1&lang=en";
var uriBuilder = new UriBuilder(longurl);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["action"] = "login1";
query["attempts"] = "11";
uriBuilder.Query = query.ToString();
longurl = uriBuilder.ToString();
// "http://somesite.example:80/news.php?article=1&lang=en&action=login1&attempts=11"
How to build a query string for a URL in C#?
If you look under the hood the QueryString property is a NameValueCollection. When I've done similar things I've usually been interested in serialising AND deserialising so my suggestion is to build a NameValueCollection up and then pass to:
using System.Linq;
using System.Web;
using System.Collections.Specialized;
private string ToQueryString(NameValueCollection nvc)
{
var array = (
from key in nvc.AllKeys
from value in nvc.GetValues(key)
select string.Format(
"{0}={1}",
HttpUtility.UrlEncode(key),
HttpUtility.UrlEncode(value))
).ToArray();
return "?" + string.Join("&", array);
}
I imagine there's a super elegant way to do this in LINQ too...
Replace item in querystring
Maybe you could use the System.UriBuilder
class. It has a Query
property.
Related Topics
Center Multiple Rows of Controls in a Flowlayoutpanel
Unrolled Loop Works, for Loop Does Not Work
Get Text/Value from Textbox After Value/Text Changed Server Side
Newtonsoft JSON.Net Deserialization Error Where Fields in JSON Change Order
What Does System.Double[*] Mean
How to Deserialize Xml If the Return Type Could Be an Error or Success Object
How to Target Attributes for a Record Class
Linq to Entities Doesn't Recognize a Method
Minimal and Correct Way to Map One-To-Many with Nhibernate
Filter SQL Based on C# List Instead of a Filter Table
Two Dimensional Array Slice in C#
.Net and Bitmap Not Automatically Disposed by Gc When There Is No Memory Left
.Net Regex Matching $ with the End of the String and Not of Line, Even with Multiline Enabled