修改请求查询字符串参数以构建新链接,而无需求助于字符串操作

And*_*w M 6 asp.net url query-string

我想动态填充当前请求的URI链接,但设置一个特定的查询字符串参数.所有其他查询字符串参数(如果有的话)应保持不变.我事先并不知道它们可能是什么.

例如,假设我想建立一个链接返回到当前页面,但与查询参数"valueOfInterest"一直被设置为"维布勒"(我是从aspx页面的代码隐藏在做这个,的.Net 3.5 C#FWIW).

例如,请求这两个中的任何一个:

/somepage.aspx
/somepage.aspx?valueOfInterest=sausages
Run Code Online (Sandbox Code Playgroud)

会成为:

/somepage.aspx?valueOfInterest=wibble
Run Code Online (Sandbox Code Playgroud)

最重要的(可能)请求:

/somepage.aspx?boring=something
/somepage.aspx?boring=something&valueOfInterest=sausages
Run Code Online (Sandbox Code Playgroud)

会保留无聊的参数成为:

/somepage.aspx?boring=something&valueOfInterest=wibble
Run Code Online (Sandbox Code Playgroud)

注意事项:如果asp.net中更优雅的东西更强大,我想避免字符串操作.但是,如果没有更优雅的东西,那就这样吧.

我做了(一点点)作业:我找到了一篇博文,建议将请求复制到本地HttpRequest对象中,但是仍然有查询字符串参数的只读集合.我也看过使用URI对象,但似乎没有查询字符串

egr*_*nin 6

只要[1]你有一个有效的URL开始(这似乎是合理的)[2]你确保你的新值('香肠')被正确转义.没有解析,唯一的字符串操作是连接参数.

编辑

这是C#:

    UriBuilder u = new UriBuilder(Request.Url);
    NameValueCollection nv = new NameValueCollection(Request.QueryString);

    /* A NameValueColllection automatically makes room if this is a new
       name. You don't have to check for NULL.
     */
    nv["valueOfInterest"] = "sausages";

    /* Appending to u.Query doesn't quite work, it
       overloaded to add an extra '?' each time. Have to 
       use StringBuilder instead.
    */
    StringBuilder newQuery = new StringBuilder();
    foreach (string k in nv.Keys)
        newQuery.AppendFormat("&{0}={1}", k, nv[k]);

    u.Query = newQuery.ToString();
    Response.Redirect(u.Uri.ToString());
Run Code Online (Sandbox Code Playgroud)