【问题标题】:How do I create a query string in a C# Windows Store App (a.k.a. WinRT/Metro)?如何在 C# Windows 应用商店应用程序(又名 WinRT/Metro)中创建查询字符串?
【发布时间】:2014-01-16 16:11:25
【问题描述】:

我想使用 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 中能找到的最好的 sn-p 是这样的:

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/en-us/library/system.uribuilder.query(v=vs.110).aspx

Microsoft 是否真的暗示我应该自己将参数与“=”和“&”一起加入?没有更好的办法吗?

【问题讨论】:

    标签: c# .net windows-runtime windows-store-apps url-encoding


    【解决方案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 团队为什么决定这样做?
    • 也许他们不明白它的实际使用频率。值得庆幸的是,实现起来并不复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多