如何在C# Windows Store应用程序(也称WinRT/Metro)中创建查询字符串?

5

我想用HTTP GET查询字符串访问Web资源,例如:

http://stackoverflow.com/search?q=search%20example&tab=relevance

在常规的.NET Framework 4.5应用程序中,您可以使用System.Net.WebClient.QueryString

备注

QueryString属性包含一个NameValueCollection实例,其中包含作为查询字符串附加到URI的名称/值对。 QueryString属性的内容以问号(?)开头,并且名称/值对彼此之间由&符号(&)分隔。

对于商店应用程序,您甚至可以使用Windows.Foundation.WwwFormUrlDecoder解析它们。
但是对于创建查询字符串,我在MSDN中找到的最好的代码片段是这个:
UriBuilder baseUri = new UriBuilder("http://www.contoso.com/default.aspx?Param1=7890");
string queryToAppend = "param2=1234";

if (baseUri.Query != null && baseUri.Query.Length > 1)
    baseUri.Query = baseUri.Query.Substring(1) + "&" + queryToAppend; 
else
    baseUri.Query = queryToAppend; 

(来源:http://msdn.microsoft.com/zh-cn/library/system.uribuilder.query(v=vs.110).aspx)

微软真的在暗示我应该自己使用“=”和“&”来连接我的参数吗?难道没有更好的方法吗?

1个回答

1
目前我不知道有这样的工具可用。
很容易创建一个与原始.NET功能相似的东西:
public static class UriExtensions
{
    public static Uri CreateUriWithQuery(Uri uri, NameValueCollection values)
    {
        var queryStr = new StringBuilder();
        // presumes that if there's a Query set, it starts with a ?
        var str = string.IsNullOrWhiteSpace(uri.Query) ?
                  "" : uri.Query.Substring(1) + "&";

        foreach (var value in values)
        {
            queryStr.Append(str + value.Key + "=" + value.Value);
            str = "&";
        }
        // query string will be encoded by building a new Uri instance
        // clobbers the existing Query if it exists
        return new UriBuilder(uri)
        {
            Query = queryStr.ToString()
        }.Uri;
    }
}

public class NameValueCollection : Dictionary<string, string> 
{
}

使用方式如下:
var uri = UriExtensions.CreateUriWithQuery(new Uri("http://example.com"), 
    new NameValueCollection { { "key1", "value1" }, { "key2", "value2" }});

结果:

http://localhost/?key1=value1&key2=value2

谢谢!可惜每个人都必须“重新发明轮子”...我不知道为什么.NET团队会这样决定? - divieira
也许他们没有意识到它实际上会被频繁使用。幸运的是,它的实现并不复杂。 - WiredPrairie

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