【问题标题】:Assign the entire QueryString to a String?将整个 QueryString 分配给一个字符串?
【发布时间】:2014-07-07 19:19:41
【问题描述】:

在我的 Windows Phone 8 项目中,我将一个非常长的查询字符串从一个页面传递到另一个页面。

我需要将这些参数从新页面传递到另一个页面,但不想重建整个 QueryString。

有没有办法将整个 QueryString 分配给一个新字符串?

类似

String newQuery = NavigationContext.QueryString.ToString();

【问题讨论】:

    标签: c# string windows-phone-8 query-string tostring


    【解决方案1】:

    我需要将这些参数从新页面传递到另一个页面,但是 不想重建整个 QueryString

    为什么不呢?这就是编程:在一个地方完成所有工作,这样您以后就不必再做一次了。让我们使用extension method 来执行此操作。

    银光

    将此代码放在静态类中...

    public string ToQueryString(this IDictionary dict)
        {
        string querystring = "";
        foreach(string key in dict.AllKeys)
            {
            querystring += key + "=" + dict[key] + "&";
            }
        return querystring;
        }
    

    像这样使用它...

    string QueryString = NavigationContext.QueryString.ToQueryString();
    

    ASP.NET

    当我最初阅读这个问题时,我认为它是针对 ASP.NET,而不是 Silverlight。我将在此处留下 ASP.NET 答案,以防有人偶然发现它正在寻找如何在 ASP.NET 中执行此操作。

    public string ToQueryString(this NameValueCollection qs)
    {
        string querystring = "";
        foreach(string key in qs.AllKeys)
            {
            querystring += key + "=" + qs[key] + "&";
            }
        return querystring;
    }
    

    像这样使用它...

    string QueryString = Request.QueryString.ToQueryString();
    

    对于 ASP.NET,有些东西已经存在。但我觉得证明你可以在某个地方完成所有工作很重要。然后不必再做一次。如果您想使用内置方式,可以使用Query property of the Uri class。

    string QueryString = System.Web.HttpContext.Current.Request.Url.Query;
    

    【讨论】:

    • 本例中的类型为 IDictionarymsdn.microsoft.com/en-us/library/…
    • @Nick 错过了。我添加了 Silverlight 示例。
    • @mason 我正在使用 c#,“内置方式”对我不起作用,因为 HtmlPage 似乎不存在,除非我必须包含一些东西?我并不反对编程,我只是习惯了 Web 开发,因为抓取 URL 查询字符串通常是内置命令。
    • @DanJamesPalmer 我更新了答案以完全限定 HtmlPage 的路径。现在试试。您还可以在类的顶部添加一个 using 语句,例如:using System.Windows.Browser; 人们经常将命名空间从他们的 SO 答案中删除。如果您使用的是 Visual Studio,如果您将鼠标悬停在 HtmlPage 上,Intellisense 可以为您检测命名空间,然后单击显示的选项之一以完全限定它或添加 using 语句。
    • @mason 完整路径没有帮助,因为 system.windows 中不存在 .Browser 命名空间。我熟悉 VisualStudio 的悬停功能,但在这种情况下,没有选择这样做。我已经包含了“system.windows”命名空间。还有什么想法吗?
    【解决方案2】:

    这是一种可能更简单的方法......

    您可以将结果投影为您选择的格式。下面是一个简单的例子。 我使用了IDictionary<string,string>,因为它是underlying type 的NavigationContext.QueryString

    var test = new Dictionary<String,String>();
    test.Add("1", "one");
    test.Add("2", "two");
    test.Add("3", "three");
    
    // Choose any string format you wish and project to array
    var newArray = test.Select(item => item.Key + ":" + item.Value).ToArray();
    
    // Join on any separator
    string output = String.Join(",", newArray);
    

    这仍然意味着您必须稍后解释结果(根据您选择的格式)。在这里,您将获得类似

    的格式
    "1:one,2:two,3:three"
    

    【讨论】:

      【解决方案3】:

      如果您已将其作为查询字符串发送,只需在 OnNavigatedTo() 方法中将其拉回,然后您可以将查询存储在页面中,直到您继续前进?

      string newQuery;
      
      protected override void OnNavigatedTo(NavigationEventArgs e)
      {
          newQuery = NavigationContext.QueryString["queryName"];
      }
      

      【讨论】:

      • 所以这将记录整个查询字符串?我在字符串中有很多参数。
      • 啊,我很抱歉,我没有意识到你有很多参数。在这种情况下,我会建议像@mason 所建议的那样。如果你把它放在一个静态类中,你可以从任何地方调用它,然后再次将它存储在页面中,直到你决定继续并将它用作你的 Uri 字符串
      【解决方案4】:

      试试这个:

      public string GetQueryString()
      {
          IDictionary<String, String> NavigationContextData = NavigationContext.QueryString;
          string data = "/Pagename.xaml?";
          foreach (var item in NavigationContextData)
          {
              data += item.Key + "=" + item.Value + "&";
          }
          data = data.Substring(0, data.Length - 1);
          return data;
      }
      

      【讨论】:

        【解决方案5】:

        如果它在您的 OnNavigatedTo() 事件中,您可以使用快速、简单的两行代码。这可以压缩为单行或扩展以检查? 字符的存在。如果您知道总是有参数传递,则无需检查,这两行工作正常:

        string QStr = e.Uri.ToString();
        string ParmStr = QStr.Substring(QStr.IndexOf('?') + 1);
        

        你也可以把它压缩成一行:

        string ParmStr = e.Uri.ToString().Substring(e.Uri.ToString().IndexOf('?') + 1);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-06
          • 2019-10-13
          • 1970-01-01
          • 2013-01-25
          • 2014-06-05
          • 1970-01-01
          • 1970-01-01
          • 2015-05-20
          相关资源
          最近更新 更多