【问题标题】:How to update querystring in C#?如何在 C# 中更新查询字符串?
【发布时间】:2012-04-04 00:42:50
【问题描述】:

网址中的某处有一个 &sortBy=6 。如何在单击按钮时将其更新为 &sortBy=4 或 &sortBy=2 ?我是否需要编写自定义字符串函数来创建正确的重定向 url?

如果我只需要附加一个查询字符串变量,我会这样做

string completeUrl = HttpContext.Current.Request.Url.AbsoluteUri + "&" + ...
Response.Redirect(completeUrl);

但我想做的是修改现有的查询字符串变量。

【问题讨论】:

标签: c# asp.net query-string


【解决方案1】:

要修改现有的 QueryString 值,请使用以下方法:

var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
nameValues.Set("sortBy", "4");
string url = Request.Url.AbsolutePath;
Response.Redirect(url + "?" + nameValues); // ToString() is called implicitly

我会在another response 中详细介绍。

【讨论】:

    【解决方案2】:

    获取sortby的查询字符串,然后对完整的Url进行字符串替换如下:

    string sUrl = *retrieve the required complete url*
    string sCurrentValue = Request.QueryString["sortby"];
    sUrl = sUrl.Replace("&sortby=" + sCurrentValue, "&sortby=" + newvalue);
    

    让我知道进展如何:)

    祝你好运

    【讨论】:

      【解决方案3】:
          private void UpdateQueryString(string queryString, string value)
          {
              PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
              isreadonly.SetValue(this.Request.QueryString, false, null);
              this.Request.QueryString.Set(queryString, value);
              isreadonly.SetValue(this.Request.QueryString, true, null);
          }
      

      【讨论】:

      • 如果您不能/不想使用 Response.Redirect 或任何回发方法,这是最好的方法
      【解决方案4】:

      如果你真的想要这个,你需要重定向到新的同一页面,并更改查询字符串,因为已经有人回答了。这将再次加载您的页面,再次加载页面只是为了更改查询字符串,这是不好的做法。

      但是你为什么需要这个?

      如果您想将 sortBy 的值从 6 更改为 4 以在应用程序的任何地方使用,我的建议是将查询字符串的值存储到某个变量或视图状态中,并在任何地方使用该视图状态。

      例如

      在Page_Load中你可以写

      if (!IsPostBack)
      {
        ViewState["SortBy"] = Request.QueryString["sortBy"];
      }
      

      在其他任何地方(即使在回发之后),您都可以使用 ViewState["SortBy"]

      【讨论】:

      • 我需要在不同页面之间保留状态。 Viewstate 仅适用于回发到同一页面。
      • 那么你可以使用Session而不是ViewState
      • 我知道服务器端选项。我也可以使用cookies。但如果我能让查询字符串工作,那将是理想的。
      • 您能否发送有关您的确切要求的更多详细信息,导致从查询字符串中获取值始终不可靠,如果用户最初在查询字符串中输入值以加载页面,并且在单击之前更改某些内容之后在说保存/更新按钮上,他更改了查询字符串中的值。您的查询字符串值将不匹配以将数据保存到正确的记录。
      • @ImranRizvi,如果担心安全问题,可以对其进行哈希处理
      【解决方案5】:

      基于 Ahmad 解决方案,我创建了以下可以普遍使用的方法

      private string ModifyQueryStringValue(string p_Name, string p_NewValue)
      {
      
          var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
          nameValues.Set(p_Name, p_NewValue);
          string url = Request.Url.AbsolutePath;
          string updatedQueryString = "?" + nameValues.ToString();
          return url + updatedQueryString;
      }
      

      然后我们如下

      Response.Redirect(ModifyQueryStringValue("SortBy","4"));
      

      【讨论】:

        【解决方案6】:

        您需要重定向到一个新的 URL。如果您需要在重定向之前在服务器上做一些工作,您需要在代码中使用 Response.Redirect(...) 。如果您不需要在服务器上进行工作,只需使用 HyperLink 并提前渲染即可。

        如果您询问构建实际 URL,我不知道有任何内置函数可以完成这项工作。您可以对 Paths 和 QueryString 参数使用常量,以避免在整个代码中重复它们。

        UriBuilder 可以帮助您构建 URL,但不能帮助您构建查询字符串

        【讨论】:

          【解决方案7】:

          您可以在客户端使用一些 javascript 来构建查询字符串并使用 windows.open 重定向页面。

          否则,您可以在服务器端使用 Response.Redirect 或 Server.Transfer。

          【讨论】:

            【解决方案8】:

            SolrNet 有一些非常有用的 Url 扩展方法。 http://code.google.com/p/solrnet/source/browse/trunk/SampleSolrApp/Helpers/UrlHelperExtensions.cs?r=512

                /// <summary>
                /// Sets/changes an url's query string parameter.
                /// </summary>
                /// <param name="helper"></param>
                /// <param name="url">URL to process</param>
                /// <param name="key">Query string parameter key to set/change</param>
                /// <param name="value">Query string parameter value</param>
                /// <returns>Resulting URL</returns>
                public static string SetParameter(this UrlHelper helper, string url, string key, string value) {
                    return helper.SetParameters(url, new Dictionary<string, object> {
                        {key, value}
                    });
                }
            

            【讨论】:

              【解决方案9】:

              您必须更改 QueryString 的唯一方法是使用新的 QueryString 重定向到同一页面:

              Response.Redirect("YourPage.aspx?&sortBy=4")
              

              http://msdn.microsoft.com/en-us/library/a8wa7sdt(v=vs.100).aspx

              【讨论】:

                【解决方案10】:

                我认为您可以在您的服务器端代码中以下列方式替换查询字符串。

                NameValueCollection filtered = new NameValueCollection(request.QueryString);
                
                filtered.Remove("SortBy");
                filtered.Add("SortBy","4");
                

                【讨论】:

                • 我正在寻找您推荐的内容。但是如果我过滤了。Remove("SortBy");它还会删除值 (=2" 和前缀字符串 "&" 吗?这就是我需要的。
                • 此方法为您提供键/值的字典,其中键是参数名称,值是参数的值。如果您删除 sortBy 这也将删除值和 &。不过,我需要尝试 100% 确定,我已经有一段时间没有处理服务器代码了。
                【解决方案11】:

                查询字符串被传递到服务器。您可以根据需要将查询字符串作为字符串处理 - 但在页面准备好再次读取它之前它不会做任何事情(即发送回服务器)。因此,如果您要询问如何处理查询字符串的值,您只需访问它 Request.QueryString["key"]。如果您希望服务器考虑查询字符串中的这种“更改”,您只需要使用新值有效地重新加载页面。因此,再次构造 url,例如 page.aspx?id=30,并将其传递给重定向方法。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-02-09
                  • 2019-04-20
                  • 2020-01-11
                  相关资源
                  最近更新 更多