1. 程式人生 > 其它 >C#、 .net 修改和移除 url 中的引數

C#、 .net 修改和移除 url 中的引數

方法是從nopcommerce中提取的

using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.WebUtilities;

namespace ConsoleApp4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string url = "http://www.baidu.com?id=1&key=123";
            var urlModify = ModifyQueryString(url, "
key", "456","567"); Console.WriteLine(urlModify); var urlRemove = RemoveQueryString(url, "key"); Console.WriteLine(urlRemove); Console.ReadKey(); } public static string ModifyQueryString(string url, string key, params string[] values) {
if (string.IsNullOrEmpty(url)) return string.Empty; if (string.IsNullOrEmpty(key)) return url; //prepare URI object var uriStr = url; var uri = new Uri(uriStr, UriKind.Absolute); //get current query parameters
var queryParameters = QueryHelpers.ParseQuery(uri.Query); //and add passed one queryParameters[key] = string.Join(",", values); //add only first value //two the same query parameters? theoretically it's not possible. //but MVC has some ugly implementation for checkboxes and we can have two values //find more info here: http://www.mindstorminteractive.com/topics/jquery-fix-asp-net-mvc-checkbox-truefalse-value/ //we do this validation just to ensure that the first one is not overridden var queryBuilder = new QueryBuilder(queryParameters .ToDictionary(parameter => parameter.Key, parameter => parameter.Value.FirstOrDefault()?.ToString() ?? string.Empty)); //create new URL with passed query parameters url = $"{uri.GetLeftPart(UriPartial.Path)}{queryBuilder.ToQueryString()}{uri.Fragment}"; return url; } public static string RemoveQueryString(string url, string key, string value = null) { if (string.IsNullOrEmpty(url)) return string.Empty; if (string.IsNullOrEmpty(key)) return url; //prepare URI object var uri = new Uri(url, UriKind.Absolute); //get current query parameters var queryParameters = QueryHelpers.ParseQuery(uri.Query) .SelectMany(parameter => parameter.Value, (parameter, queryValue) => new KeyValuePair<string, string>(parameter.Key, queryValue)) .ToList(); if (!string.IsNullOrEmpty(value)) { //remove a specific query parameter value if it's passed queryParameters.RemoveAll(parameter => parameter.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase) && parameter.Value.Equals(value, StringComparison.InvariantCultureIgnoreCase)); } else { //or remove query parameter by the key queryParameters.RemoveAll(parameter => parameter.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase)); } var queryBuilder = new QueryBuilder(queryParameters); //create new URL without passed query parameters url = $"{uri.GetLeftPart(UriPartial.Path)}{queryBuilder.ToQueryString()}{uri.Fragment}"; return url; } } }