【问题标题】:Check if non-valued query string exists in url with C#使用 C# 检查 url 中是否存在非值查询字符串
【发布时间】:2014-01-18 12:49:58
【问题描述】:

我已经看到了几个使用 C# 检查 url 中是否存在查询字符串的示例:

www.site.com/index?query=yes

if(Request.QueryString["query"]=="yes")

但是我如何检查没有参数的字符串呢?我只需要看看它是否存在。

www.site.com/index?query

if(Request.QueryString["query"] != null) //why is this always null?

我知道可能有一个简单的答案,我会觉得自己很笨,但我还没有找到它。谢谢!

【问题讨论】:

  • 如果可能的话,不要试图在那个庄园里提供信息。确保调用者为查询参数设置一个值以通过查询参数传递信息,或者如果它作为键/值对没有意义,则改为以另一种方式操作查询。查询参数没有增值信息会让使用该网站的人感到困惑。
  • 这对我来说很有意义。不过,我可能无法更改 URL,因为我一开始并没有创建它,而我的主管将它用于统计数据等。我会问他是否可以将其切换为 'query=true' 类型的查询字符串。

标签: c# url query-string


【解决方案1】:

如果不指定值,key会自动设置为null,所以无法检查是否存在。

为了检查该值是否确实存在,您可以检查 Values 集合,如果它包含您的 Key,则等于 null

Request.QueryString.GetValues(null).Contains("query")

【讨论】:

  • 这很好用,你只需要在获取值后检查 null
【解决方案2】:

当未提供“=”时,您不能使用 null 检查来确定键是否存在,因为 null 表示该键不在查询字符串中。

问题是“查询”被视为具有空键的值,而不是具有空值的键。

在这种情况下,Request.QueryString.AllKeys 中的键也是 null。

我使用这种通用方法在使用它之前“修复”了查询字符串中的空键问题。这不涉及手动解析字符串。

使用示例:

var fixedQueryString = GetFixedQueryString(Request.QueryString);
if (fixedQueryString.AllKeys.Contains("query"))
{
}

方法:

public static NameValueCollection GetFixedQueryString(NameValueCollection originalQueryString)
{
      var fixedQueryString = new NameValueCollection();

      for (var i = 0; i < originalQueryString.AllKeys.Length; i++)
      {
          var keyName = originalQueryString.AllKeys[i];

          if (keyName != null)
          {
              fixedQueryString.Add(keyName, originalQueryString[keyName]);
          }
          else
          {                       
              foreach (var keyWithoutValue in originalQueryString[i].Split(','))
              {
                  fixedQueryString.Add(keyWithoutValue, null);
              }              
          }
      }

      return fixedQueryString;
}

【讨论】:

    【解决方案3】:

    我更喜欢使用:

    If(Request.QueryString.AllKeys.Contains("query")
    {
        //
    }
    

    【讨论】:

      【解决方案4】:

      感谢 Ludovic 的回答,这是检查它的最快方法

      if(Request.QueryString.GetValues(null)?.Contains("query")??false)
      

      【讨论】:

        【解决方案5】:

        这是冗长的,它有效。 Here is a .NET Fiddle.

        @using System.Linq;
        
        @{
            var empties = Request.Url.Query
                .Split('&')
                .Where(s => !s.Contains("=") || s.Last() == '=');
        
            var keyExistsAndIsEmpty = empties.Any(x => x.Contains("target-key")
        }
        

        【讨论】:

        • 你的小提琴与答案无关。
        【解决方案6】:

        卢多维奇有正确的答案。但我想提供一个更强大的版本。

        var valueEntries = Request.QueryString.GetValues((string)null) ?? new string[] {};
        if (valueEntries.Contains("query", StringComparer.OrdinalIgnoreCase))
        {
            // value is specify in querystring
        }
        else
        {
            // value is NOT specify in querystring
        }
        

        【讨论】:

          【解决方案7】:

          原来如果值为null,那么QueryString集合中的key也是null。您最好的选择是简单地为查询分配一个值。您可能有一种方法可以重命名参数,以便更具语义意义。例如,您可以使用 www.site.com/index?action=getdocument 而不是 www.site.com/index?getdocument=yes

          但是,如果您仍然希望 url www.site.com/index?query 工作,有一种方法:根本不要使用 QueryString 并手动解析 URL:

          string query = Request.RawUrl.Split('?')[1];
          if (query == "query")
          {
              // send the data
          }
          

          【讨论】:

            【解决方案8】:

            如果 query 被包含为参数,但未指定值,则 query 的值将为空,但仍将存在于 Request.QueryString.AllKeys 中。

            如果不包含query,则Request.QueryString.AllKeys 中将根本不存在。

            【讨论】:

            • 这其实就是答案。除非该键具有值,否则我无法检查特定键。我不习惯在 AllKeys 中检查空键并将其保留在那里,所以我必须根据 Servy 的评论添加一个值。
            • @Emad 如果您觉得它有用,请点赞。为什么要对其他答案发表评论?
            • 我投了赞成票,但通常人们会直接看到标记为正确的答案。我希望每个人都看到还有其他选择。您的回答是正确的,但在我看来不是最好的。我什至自己发布了修改后的答案。
            • 这个答案是错误的。如果 query 被包含为参数,但没有指定值,那么 query 的值将为 null,并且在 Request.QueryString.AllKeys 中的 key 也将为 null
            • @Cesar 它至少帮助了包括 OP 在内的一些人。我不能不接受它作为 OP 的“最佳答案”。如果另一个答案更好,我建议对其进行投票以提高知名度。
            【解决方案9】:

            它返回null,因为在该查询字符串中它没有该键的值。我想你要找的支票是这样的:

            if(Request.QueryString.Keys.OfType<string>().Any(k => k == "query"))
            

            甚至:

            if(Request.QueryString.AllKeys.Any(k => k == "query"))
            

            后者可能更合适,因为该数组已被缓存。

            【讨论】:

            • 这些似乎都不起作用。 AllKeys 集合确实返回 1 个计数,这意味着查询字符串在其中,但 lambda 表达式找不到键。它似乎在寻找价值?
            • 啊,想通了。如果查询字符串有值,您的代码就可以工作。否则键显示为空。类似于格兰特在回答中所说的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-14
            相关资源
            最近更新 更多