惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
I
InfoQ
B
Blog RSS Feed
D
DataBreaches.Net
S
SegmentFault 最新的问题
P
Proofpoint News Feed
A
About on SuperTechFans
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
小众软件
小众软件
博客园 - Franky
有赞技术团队
有赞技术团队
D
Docker
T
Tailwind CSS Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
爱范儿
爱范儿

博客园 - 落叶子

FreeRedis 实现消费确认队列和消费延时确认队列 快速部署单机k3s+Kuboard控制面板 解决微软鼠标设置宏后桌面有效果 进游戏就没有效果了 .net core 使用QRCoder在linux 下生成带logo的二维码 FreeScheduler 在asp.net core 中使用依赖注入的方式进行注入使用 GC 性能调优相关 .net 中使用OpenCvSharp 判断一张图片中是否包含指定图标 maui BlazorWebView+本地html (vue、uniapp等都可以) 接入支付宝sdk 进行支付宝支付 开发 Android app maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android app maui BlazorWebView+本地html 打包Android app 实现支付宝H5支付 maui WebView 打包Android app 实现线上网页 支付宝H5支付 maui BlazorWebView Android 中混合使用https和http 原生js+html+css 实现大转盘抽奖效果,实现人员占位,转盘缓慢停止时依次显示奖品图片 Serilog日志同步到redis中和自定义Enricher来增加额外的记录信息 c# .net 多类实现同一个接口,动态指定使用哪一个类的实现 windows 批量删除docker 镜像 uniapp 原生websocket 使用 signalr k8s docker 中部署think php 并搭建php websocket .net core Unicode 转中文
C#、 .net 修改和移除 url 中的参数
落叶子 · 2022-12-09 · via 博客园 - 落叶子

方法是从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;
        }
    }
}