繁体   English   中英

使用C#检查url中是否存在非值查询字符串

[英]Check if non-valued query string exists in url with C#

我已经看到了一些如何使用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?

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

如果未指定值,则该键将自动设置为null,因此您无法检查其是否存在。

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

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

它返回null因为在该查询字符串中它没有该键的值。 我认为您正在寻找的支票是这样的:

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

甚至:

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

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

Ludovic有正确的答案。 但我想提供一个更强大的版本。

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
}

由于Ludovic的回答,这是检查它的最快方法

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

这很冗长,而且很有效。 这是一个.NET小提琴。

@using System.Linq;

@{
    var empties = Request.Url.Query
        .Split('&')
        .Where(s => !s.Contains("=") || s.Last() == '=');

    var keyExistsAndIsEmpty = empties.Any(x => x.Contains("target-key")
}

事实证明,如果值为null,则QueryString集合中的键也为null。 您最好的选择就是为查询分配一个值。 可能有一种方法可以重命名参数,以便更具语义感。 例如,而不是www.site.com/index?getdocument=yes你可以做www.site.com/index?action=getdocument

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

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

如果未提供“=”,则无法使用空检查来确定密钥是否存在,因为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;
}

我更喜欢使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM