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

推荐订阅源

V
V2EX
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
博客园 - Franky
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
S
SegmentFault 最新的问题
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
B
Blog RSS Feed
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 司徒正美
The Cloudflare 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;
        }
    }
}