C# 用C检查url中是否存在无值查询字符串#
我已经看到了两个示例,说明了如何使用C#检查url中是否存在查询字符串:C# 用C检查url中是否存在无值查询字符串#,c#,url,query-string,C#,Url,Query String,我已经看到了两个示例,说明了如何使用C#检查url中是否存在查询字符串: www.site.com/index?query=yes if(Request.QueryString["query"]=="yes") 但是我如何检查没有参数的字符串呢?我只是想看看它是否存在 www.site.com/index?查询 if(Request.QueryString["query"] != null) //why is this always null? 我知道可能有一个简单的答案,我会觉得自己很笨,
www.site.com/index?query=yes
if(Request.QueryString["query"]=="yes")
但是我如何检查没有参数的字符串呢?我只是想看看它是否存在
www.site.com/index?查询
if(Request.QueryString["query"] != null) //why is this always null?
我知道可能有一个简单的答案,我会觉得自己很笨,但我还没找到答案。谢谢 它返回
null
,因为在该查询字符串中,它没有该键的值。我想你要找的支票是:
if(Request.QueryString.Keys.OfType<string>().Any(k => k == "query"))
后者可能更合适,因为该数组已被缓存。如果
query
作为参数包含,但未指定任何值,则query
的值将为null,但仍将存在于Request.QueryString.AllKeys
中
如果未包含
query
,则它将根本不存在于Request.QueryString.AllKeys
中。结果表明,如果值为null,则QueryString
集合中的键也为null。您的最佳选择就是为查询分配一个值。可能有一种方法可以重命名该参数,使其更具语义意义。例如,您可以不使用www.site.com/index?getdocument=yes
而使用www.site.com/index?action=getdocument
但是,如果您仍然希望urlwww.site.com/index?query
正常工作,有一种方法:根本不使用QueryString
并手动解析url:
string query = Request.RawUrl.Split('?')[1];
if (query == "query")
{
// send the data
}
如果未指定值,则该键将自动设置为null,因此无法检查其存在性 为了检查该值是否实际存在,您可以检查值的集合是否等于
null
,如果它包含您的键:
Request.QueryString.GetValues(null).Contains("query")
卢多维奇的答案是正确的。但我想提供一个更健壮的版本
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
}
这是冗长的,而且有效
多亏了卢多维奇的回答,这是最快的检查方法
if(Request.QueryString.GetValues(null)?.Contains("query")??false)
我更喜欢使用:
If(Request.QueryString.AllKeys.Contains("query")
{
//
}
当未提供“=”时,不能使用null检查来确定键是否存在,因为null表示该键不在查询字符串中 问题是“查询”被视为具有空键的值,而不是具有空值的键 在这种情况下,
Request.QueryString.AllKeys
中的键也为空
在使用该方法之前,我使用该通用方法“修复”查询字符串中的空键问题。这不涉及手动解析字符串
用法示例:
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;
}
公共静态NameValueCollection GetFixedQueryString(NameValueCollection originalQueryString)
{
var fixedQueryString=new NameValueCollection();
对于(变量i=0;i
如果可能,不要试图在该庄园提供信息。请确保调用者为查询参数设置一个值以通过查询参数传递信息,或者如果它作为键/值对没有意义,则改为以另一种方式操作查询。拥有一个没有增值信息的查询参数会让那些使用该网站的人感到困惑。这对我来说很有意义。但我可能无法更改URL,因为我一开始并没有创建它,我的主管将其用于统计等。我会问他是否同意将其切换为“query=true”类型的查询字符串。这两种方法似乎都不起作用。AllKeys集合确实返回1计数,这意味着查询字符串在其中,但lambda表达式找不到该键。它似乎在寻找价值?啊,找到了。如果查询字符串具有值,则代码可以工作。否则,密钥将显示为null。与格兰特在回答中所说的相似。这实际上是答案。我无法检查特定的键,除非该键具有值。我不喜欢在AllKeys中检查空键,而只保留它,所以我必须根据Servy的评论添加一个值。@Emad,如果您发现它有用,请向上投票。为什么要在其他答案上留下评论?我确实投了赞成票,但通常人们会直接看标有正确的答案。我想让每个人都看到还有其他选择。你的回答是对的,但我认为不是最好的。我甚至自己发布了一个修改过的答案。这个答案是错误的。如果查询作为参数包含,但未指定值,则查询的值将为null,并且Request.QueryString中的键也将为null。AllKeys@Cesar它至少帮助了包括OP在内的一些人。我不能不接受它作为OP的“最佳答案”。如果另一个答案更好,我建议对它进行投票,以便它更具可视性。这很好,您只需在获取值后检查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;
}