代码之家  ›  专栏  ›  技术社区  ›  Andrew M

修改请求querystring参数以构建新链接,而不诉诸字符串操作

  •  6
  • Andrew M  · 技术社区  · 15 年前

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

    例如,假设我想建立一个指向当前页面的链接,但是querystring参数“valueofinterest”总是设置为“wibble”(我是从c fwiw中的aspx页面,.net 3.5后面的代码中完成的)。

    对这两种情况之一的请求:

    /somepage.aspx
    /somepage.aspx?valueOfInterest=sausages
    

    会变成:

    /somepage.aspx?valueOfInterest=wibble
    

    最重要的是(也许)要求:

    /somepage.aspx?boring=something
    /somepage.aspx?boring=something&valueOfInterest=sausages
    

    会让无聊的情人变成:

    /somepage.aspx?boring=something&valueOfInterest=wibble
    

    注意:如果asp.net中有更优雅、更健壮的东西,我想避免字符串操作。不过,如果没有更优雅的东西,那就随它去吧。

    我做了(一点)家庭作业: 我发现一篇博客文章建议将请求复制到一个本地httprequest对象中,但它仍然有一个用于querystring参数的只读集合。我也看到过使用uri对象,但似乎没有querystring

    3 回复  |  直到 12 年前
        1
  •  6
  •   egrunin    15 年前

    只要[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());
    
        2
  •  1
  •   Laurence Burke    15 年前
            UriBuilder u = new UriBuilder(Request.Url);
            NameValueCollection nv = new NameValueCollection(Request.QueryString);
            nv["valueofinterest"] = "wibble";
            string newQuery = "";
    
            foreach (string k in nv.Keys)
            {
                newQuery += k + "=" + nv[k] + "&";
            }
            u.Query = newQuery.Substring(0,newQuery.Length-1);
            Response.Redirect(u.ToString());
    

    应该可以的

        3
  •  0
  •   cjk    15 年前

    如果你找不到可以做它的东西,那么就建立一个防弹功能来做它,这个功能经过了彻底的测试并且可以依赖。如果这使用字符串操作,但是是有效的,并且经过了充分的测试,那么实际上它与您可能找到的任何方法都没有什么不同。