C# 在ASP.NET中访问没有值的查询字符串参数

C# 在ASP.NET中访问没有值的查询字符串参数,c#,asp.net,query-string,C#,Asp.net,Query String,我正在尝试设置一个具有两种行为的页面。我通过URL将它们分开:一个行为是通过/some controller/some action访问的,另一个是通过/some controller/some action?自定义访问的 它看起来不像Request.QueryString对象包含任何内容,不过,当我访问第二个URL时……我的意思是,keys集合中有一个元素,但它是null,而不是“customize”。任何人对此或如何实现这一点有任何想法。我希望不惜一切代价避免手动解析查询字符串:)。ASP.

我正在尝试设置一个具有两种行为的页面。我通过URL将它们分开:一个行为是通过
/some controller/some action
访问的,另一个是通过
/some controller/some action?自定义
访问的


它看起来不像Request.QueryString对象包含任何内容,不过,当我访问第二个URL时……我的意思是,keys集合中有一个元素,但它是
null
,而不是
“customize”
。任何人对此或如何实现这一点有任何想法。我希望不惜一切代价避免手动解析查询字符串:)。

ASP.NET不支持确定是否存在没有值的查询字符串参数,因为
Request。QueryString[“customize”]
Request。QueryString[“foo”]
都是
null
。您必须自己解析它,或者指定一个值,例如
?customize=1

您可以测试
请求.Url的值。如果
,则查询
?customize
是您唯一要查找的参数。

无键参数 约翰·谢尔曼的回答在技术上是正确的。不支持不带值的查询参数,但支持不带键的查询值

换句话说,
“/some controller/some action?customize”
被认为是一个URL,其中有一个查询参数,其值为
“customize”
,并且没有键(即
null的键)

收回 要检索所有此类查询参数,可以使用
Request.QueryString.GetValues(null)
将其作为字符串数组检索,也可以使用
Request.QueryString[null]
将其作为单个逗号分隔的字符串检索

空参数 空参数(如
“?foo=bar&&spam=eggs”
)将显示为
string的值。空的
键为
null
,尾随的
“&

例如,相当不常用的查询字符串
“?&”
,将显示为
string.Empty
的两个值,两个值的键均为
null

空查询字符串 有一个边缘案例不符合该模式。这是临时但当前的查询字符串(例如“/some controller/some action?”)。根据前面显示的模式,它将有一个值,即
string.Empty
,键为
null
。然而,在现实中,它将没有任何价值

其他查询参数信息 虽然不是这个问题的直接部分,但这些补充信息可能也很有用

分隔符 ASP.NET不支持以“
”;”分隔的查询参数作为
&
的替代方案

以“=”开头的参数 以
'='
开头的查询参数被认为有一个键,该键应该是
string.Empty
。不要将其与
null
键混淆。例如,
“/some controller/some action?=baz”
有一个值,其键为
string.Empty,值为
baz

多个“=”字符 如果有多个
'='
字符,则键是第一个
'='
字符前面的所有内容,值是它后面的所有内容

例如
“/some controller/some action?foo=bar=baz”
有一个参数,其键为
“foo”
,值为
bar=baz

ann其他示例
“/some controller/some action?eggs==spam”
有一个参数,其键为
“eggs”
,值为
“=spam”

同名的多个参数 正如我在另一个答案中所暗示的,还支持相同名称的多个参数

例如,如果URL是
“/some controller/some action?foo=bar&foo=baz”
,则
Request.QueryString[“foo”]
的结果是“bar,baz”

如果希望每个字符串分开,请使用
Response.QueryString.GetValues(“foo”)
,它返回一个字符串数组

例子 以下高度不可测量的URL将被视为具有六个参数:
“/some controller/some action?=baz&foo=bar&edit&spam=eggs=ham&==&”

它们是:

+--------------+--------------+
|     Key      |     Value    |
+--------------+--------------+
| string.Empty | "baz"        |
| "foo"        | "bar"        |
| null         | "edit"       |
| "spam"       | "eggs=ham"   |
| string.Empty | "="          |
| null         | string.Empty |
+--------------+--------------+    

突然意识到我可能错了,可能会执行
Request.QueryString.HasKey(“自定义”)
,但我记得过去我一直走这条路,在四处搜索后找不到解决方案,看起来QueryString字典值只填充有名称和值的参数,所以HasKey不起作用。但是,特别有趣的是,如果您提供了一个
?customize
查询字符串,QueryString字典将填充一个键,但它在集合中为null——无论出于何种原因,它都没有相关的值。我觉得这是一种奇怪的行为!更有趣的是,如果您执行Request.QueryString.ToString(),它会显示密钥!显示了一种方法,它确实有效:您认为“无值”参数可以作为“无键”参数查询。我认为这是最好的解决方案。我刚刚做了
Request.Url.Query.StartsWith()
。在处理语义URL时,能够支持这种开箱即用的方式将是非常棒的@Toft:只有将“自定义”作为唯一参数时,您的方法才有效。我使用了:
boolhascustomise=context.Request.Url.Query.Split(新字符[]{'&','?')).Contains(“customise”)
(您需要在页面中使用
System.Linq;
)键:
null
值:
edit
作为解析的结果,
&edit&
看起来非常奇怪。我想应该是反之亦然-key:
edit
value:
null
。您可能会认为是另一种方式,但该表实际上是正确的。上帝只知道微软在用这种方式编码时是怎么想的。