如何在C#中更新查询字符串?

48

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

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

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

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


3
听起来你希望将页面重定向到一个新的或更新过的网址。 - mservidio
1
我想在代码后台(服务器端)完成这个。 - developer747
您可以使用此类找到查询变量:http://msdn.microsoft.com/zh-cn/library/system.web.httprequest.querystring.aspx - mservidio
也许 UriBuilder 可以帮助你。 - brgerner
可能是更改单个URL查询字符串值的重复问题。 - Ahmad Mageed
https://dev59.com/enNA5IYBdhLWcg3wGJ0V - Tim Schmelter
11个回答

125

要修改现有的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

我在另一个回答中详细解释了。


10

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

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

请告诉我进展情况 :)
祝好运

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

1
如果您不能或不想使用Response.Redirect或任何postback方法,那么这是最好的选择。 - Lucas

2
如果您真的想要这个功能,您需要重定向到具有更改查询字符串的新页面,就像其他人已经回答过的那样。这将再次加载您的页面,仅为更改查询字符串而重新加载页面并不是一个好的做法。
但是,为什么您需要这个功能呢?
如果您想将sortBy的值从6更改为4,并在应用程序中随处使用,我的建议是将查询字符串的值存储到某个变量或视图状态中,并在所有地方使用该视图状态。
例如,在Page_Load中,您可以编写:
if (!IsPostBack)
{
  ViewState["SortBy"] = Request.QueryString["sortBy"];
}

无论何时(即使在postback之后),您都可以使用ViewState["SortBy"]来访问该值。


我需要在不同的页面之间保留状态。Viewstate 仅适用于对同一页面的 postback。 - developer747
你可以使用Session代替ViewState。 - Imran Rizvi
我知道服务器端的选项。我也可以使用cookies。但如果我能让查询字符串起作用,那就最理想了。 - developer747
你能否发送更多关于你确切需求的细节呢?因为总是从查询字符串中获取值是不可靠的。如果用户最初在查询字符串中输入一个值来加载页面,然后在点击保存/更新按钮之前更改了某些内容,他又更改了查询字符串中的值,那么你的查询字符串值将无法匹配以正确记录保存数据。 - Imran Rizvi
@ImranRizvi,如果安全是一个问题,它可以被散列。 - user3638471

2
基于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"));

0

0

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

0

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

NameValueCollection filtered = new NameValueCollection(request.QueryString);

filtered.Remove("SortBy");
filtered.Add("SortBy","4");

我正在寻找您推荐的类似方案。但是,如果我执行filtered.Remove("SortBy");,它是否也会删除值(=2"和前缀字符串"&")?这正是我需要的。 - developer747
该方法为您提供了一个键/值字典,其中键是参数名称,值是参数的值。如果您删除sortBy,这也将删除值和&符号。不过我需要尝试一下才能百分之百确定,因为我已经有一段时间没有在服务器代码上工作了。 - legrandviking

0

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

如果您正在询问如何构建实际的URL,则我不知道是否有任何内置函数可以完成此任务。您可以使用常量来代替路径和QueryString参数,以避免在代码中重复使用它们。

UriBuilder可以帮助您构建URL,但无法构建查询字符串。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接