替换查询字符串中的项目我有一个URL,也可能有查询字符串部分,查询字符串可能为空或有多个项目。我想替换查询字符串中的项目,或者添加该项目(如果它尚不存在)。我有一个带有完整URL的URI对象。我的第一个想法是使用正则表达式和一些字符串魔术,应该可以做到。但它似乎有点不稳定,也许框架有一些查询字符串构建器类?也许您可以使用System.UriBuilder类。它有一个查询属性。我发现这是一个更优雅的解决方案varqs=HttpUtility.ParseQueryString(Request.QueryString.ToString());qs.Set("项目",newItemValue);Console.WriteLine(qs.ToString());让我们有这个url:https://localhost/video?param1=value1首先将特定的查询字符串参数更新为新值:varuri=newUri("https://localhost/video?param1=value1");varqs=HttpUtility.ParseQueryString(uri.Query);qs.Set("param1","newValue2");接下来创建UriBuilder并更新Query属性以生成具有更改的参数值的新uri。varuriBuilder=newUriBuilder(uri);uriBuilder.Query=qs.ToString();varnewUri=uriBuilder.Uri;现在你在newUri中有了这个值:https://localhost/video?param1=newValue2stringlink=page.Request.Url.ToString();if(page.Request.Url.Query=="")link+="?pageIndex="+pageIndex;elseif(page.Request.QueryString["pageIndex"]!=""){varidx=page.Request.QueryString["pageIndex"];link=link.Replace("pageIndex="+idx,"pageIndex="+pageIndex);}elselink+="&pageIndex="+pageIndex;这看起来很好用。我使用以下方法:t.Set(键,值);返回t.ToString();不,该框架没有任何现有的QueryStringBuilder类,但通常HTTP请求中的查询字符串信息可通过Request.Querystring属性作为可迭代和可搜索的NameValueCollection获得。但是,由于您是从Uri对象开始的,因此需要使用Uri对象的Query属性来获取查询字符串部分。这将生成以下形式的字符串:UrimyURI=newUri("http://www.mywebsite.com/page.aspx?Val1=A&Val2=B&Val3=C");字符串querystring=myURI.Query;//输出:“?Val1=A&Val2=B&Val3=C”。注意?字首!控制台.WriteLine(查询字符串);然后,您可以在与号上拆分此字符串,以将其区分为不同的查询字符串参数-值对。然后每个参数在“=”字符上再次拆分,以将其区分为键和值。由于您的最终目标是搜索特定的查询字符串键并在必要时创建它,因此您应该尝试(重新)创建一个集合(最好是通用集合),以便您轻松搜索集合,类似于由NameValueCollection类。我使用以下代码附加/替换当前请求URL中的参数值:varsb=newStringBuilder();sb.AppendFormat("{0}://{1}{2}{3}",url.Scheme,url.Host,url.IsDefaultPort?"":":"+url.Port,url.LocalPath);varisFirst=true;如果(!String.IsNullOrWhiteSpace(url.Query)){varqueryStrings=url.Query.Split(new[]{'?',';'});foreach(varqueryStringinqueryStrings){if(!String.IsNullOrWhiteSpace(queryString)&&!queryString.StartsWith(paramName+"=")){sb.AppendFormat("{0}{1}",isFirst?"?":“;“,请求参数);isFirst=false;}}}sb.AppendFormat("{0}{1}={2}",isFirst?"?":";",paramName,paramValue);返回sb.ToString();也许这对其他人找到这个话题有帮助。更新:刚刚看到UriBuilder提示并使用UriBuilder、StringBuilder和Linq做了第二个版本:网址;varub=newUriBuilder(url.Scheme,url.Host,url.Port,url.LocalPath);//查询字符串varsb=newStringBuilder();varisFirst=true;如果(!String.IsNullOrWhiteSpace(url.Query)){varqueryStrings=url.Query.Split(new[]{'?',';'});foreach(varqueryStringinqueryStrings.Where(queryString=>!String.IsNullOrWhiteSpace(queryString)&&!queryString.StartsWith(paramName+"="))){sb.AppendFormat("{0}{1}",isFirst?"“:“;“,请求参数);isFirst=false;}}sb.AppendFormat("{0}{1}={2}",isFirst?"":";",paramName,paramValue);ub.Query=sb.ToString();返回ub.ToString();我同意大脑。坚持KISS原则,你有querystring,stringquerystring=myURI.Query;你知道你在找什么,你想用什么来代替它。所以使用这样的东西:-if(querystring=="")myURI.Query+="?"+替换字符串;elsequerystring.replace(searchstring,replacestring);//不太确定语法!我刚刚回答了类似问题的问题。基本上,最好的方法是使用HttpValueCollection类,它实际上是一个QueryString属性,不幸的是它在.NET框架中是内部的。您可以使用Reflector来获取它(并将其放在Utils类中)。通过这种方式,您可以像NameValueCollection一样操作查询字符串,但所有url编码/解码问题都将得到处理。HttpValueCollection扩展了NameValueCollection并具有一个构造函数,该构造函数接受编码的查询字符串(包括&符号和问号),并且它重写了ToString()方法以稍后从基础集合中重建查询字符串。publicclassQueryParams:Dictionary{privateUrioriginolUrl;私有UriammendedUrl;私有字符串方案名称;私有字符串主机名;私有字符串路径;publicQueryParams(Uriurl){this.originolUrl=url;schemeName=url.Scheme;hostname=url.Host;path=url.AbsolutePath;//检查uri以查看它是否有查询if(url.Query.Count()>1){//我们获取查询并去掉问号,因为我们不希望它附加stringquery=url.Query.TrimStart("?".ToArray());//我们获取每个查询并将它们放入数组string[]parms=query.Split("&".ToArray());foreach(stringstrinparms){//我们将每个查询拆分为两个字符串(键)和(值)并放入数组string[]param=str.Split("=".ToArray());//我们将字符串添加到这个字典中this.Add(param[0],param[1]);}}}publicQueryParamsSet(stringparamName,stringvalue){if(this.ContainsKey(paramName)){//如果键存在改变值this[paramName]=value;返回(这个);}else{this.Add(paramName,value);归还这个;}}publicQueryParamsSet(stringparamName,intvalue){if(this.ContainsKey(paramName)){//如果键存在则改变值this[paramName]=value.ToString();返回(这个);}else{this.Add(paramName,value);归还这个;}}publicvoidAdd(stringkey,intvalue){//重载,添加一个新的密钥对stringstrValue=value.ToString();这个。添加(键,strValue);}publicoverridestringToString(){StringBuilderqueryString=newStringBuilder();foreach(KeyValuePairpairinthis){//我们从每个密钥对重新创建查询queryString.Append(pair.Key+"="+pair.Value+"&");}//修剪查询字符串的末尾modifiedQuery=queryString.ToString().TrimEnd("&".ToArray());如果(this.Count()>0){UriBuilderuriBuild=newUriBuilder(schemeName,hostname);uriBuild.Path=路径;uriBuild.Query=modifiedQuery;ammendedUrl=uriBuild.Uri;返回修正后的Url.AbsoluteUri;}else{返回originolUrl.ToString();}}publicUriToUri(){this.ToString();返回修正后的网址;你可以通过预编译加速RegExps看看这个教程以上是C#学习教程:替换查询字符列表中项目分享的所有内容,如果对你有用还需要详细了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
