[英]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.