1

我有一个看起来像这样的查询字符串:

“somename1=123&QueryString=PlaceHolder%3dNothing%26anotherid%3dsomevalue&somename=somevalue”

但我希望查询字符串类似于下面的查询字符串,并用更新的查询字符串替换整个查询字符串有没有办法在没有重定向的情况下做到这一点?

"somename1=somevalue1&PlaceHolder=Nothing&somename2=somevalue2&somename3=somevalue3"

基本上需要删除: "QueryString=" with empty string "%3d" with "&" "%26" with "="

到目前为止我所做的是:

string strQueryString = Request.QueryString.ToString();
if (strQueryString.Contains("QueryString="))
{
    strQueryString = strQueryString.Replace("QueryString=", "");
    if (strQueryString.Contains("%26")) strQueryString = strQueryString.Replace("%26", "&");
    if (strQueryString.Contains("%3d")) strQueryString = strQueryString.Replace("%3d", "=");
    string x = strQueryString;
}

和:

 // reflect to readonly property
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
// make collection editable
isreadonly.SetValue(this.Request.QueryString, false, null);
if (this.Request.QueryString.ToString().Contains("QueryString="))
{
    this.Request.QueryString.ToString().Replace("QueryString=", "");
    if (this.Request.QueryString.ToString().Contains("%26")) this.Request.QueryString.ToString().Replace("%26", "&");
    if (this.Request.QueryString.ToString().Contains("%3d")) this.Request.QueryString.ToString().Replace("%3d", "=");
    string x = this.Request.QueryString.ToString();
}

// make collection readonly again
isreadonly.SetValue(this.Request.QueryString, true, null);

代码的第二部分没有替换字符,我不知道在删除所有字符或替换它们后如何将查询字符串更改为新的查询字符串。

任何帮助是极大的赞赏。

4

2 回答 2

6

不支持更改当前请求的查询字符串。使用私有反射来编辑一些内存状态很可能会破坏 ASP.NET,因为它假定查询字符串是不可变的。更改查询字符串的唯一方法是发出新请求,或者通过执行重定向,或者通过执行某种子请求,例如通过向同一页面发出新的 HTTP 请求但使用不同的查询字符串。

于 2013-04-09T17:44:38.783 回答
2

我可以建议一个不太知名的内置键/值字典Context.Items

有了这个,您非常希望获得比切换只读 QueryString 对象更好的性能,并且它还在整个请求中持续存在,因此您可以在模块、处理程序等之间共享它。

创造

string strQueryString = Request.QueryString.ToString();
if (strQueryString.Contains("QueryString="))
{
    HttpContext.Current.Items("qs") = strQueryString.Replace("QueryString=", "").Replace("%26", "&").Replace("%3d", "=");
}

采用

string x = HttpContext.Current.Items("qs_d").ToString();

旁注:我缩短了一些代码,因为不需要先检查是否包含任何内容,如果是,请替换,只需运行替换,它会更快

于 2016-03-02T08:54:45.613 回答