Parse and modify a query string in .NET Core

后端 未结 6 648
無奈伤痛
無奈伤痛 2020-11-29 00:38

I am given an absolute URI that contains a query string. I\'m looking to safely append a value to the query string, and change an existing parameter.

I would prefer

6条回答
  •  广开言路
    2020-11-29 01:36

    I use this as extention method, works with any number of params:

    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();
            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 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;
        }
    
    

    Next and prev links for example in a view:

    var next = Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex+1+"");
    
    var prev = Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex-1+"");
    

提交回复
热议问题