我正在尝试设置一个包含两个行为的页面。我用URL分隔它们:一个行为是通过/some-controller/some-action
访问的,另一个是通过/some-controller/some-action?customize
访问的。
当我访问第二个URL时,它看起来不像Request.QueryString对象包含任何东西......我的意思是,密钥集合中有一个元素,但它是null
,而不是{ {1}}。任何人对此有任何想法或如何启用此功能。我想避免不惜一切代价手动解析查询字符串:)。
答案 0 :(得分:68)
John Sherman的回答只是技术上正确的。不支持查询参数不带值 ,但支持查询值不带键 。
换句话说,"/some-controller/some-action?customize"
被视为具有一个查询参数的网址,其值为"customize"
,且没有密钥(即null
的密钥)。
要检索所有此类查询参数,请使用Request.QueryString.GetValues(null)
将其作为字符串数组检索,或者使用Request.QueryString[null]
将它们作为单个逗号分隔的字符串。
空参数(如"?foo=bar&&spam=eggs"
中所示)将显示为string.Empty
,其值为null
,跟踪"&"
一样。< / p>
例如,相当不寻常的查询字符串"?&"
将显示为string.Empty
的两个值,两者都具有null
的键。
有一个边缘表壳不适合图案。这是empy但现在的查询字符串(例如“/ some-controller / some-action?”)。根据之前显示的模式,它将具有一个值,即string.Empty
,其键为null
。但是,实际上它没有价值。
答案 1 :(得分:26)
虽然不是这个问题的直接部分,但这些附加信息也可能有用。
ASP.NET不支持由';'
分隔的查询参数,而服务器支持的W3C recommends可以替代'&'
。
以'='
开头的查询参数被视为具有密钥,即string.Empty
。不要将其与null
的密钥混淆。例如,"/some-controller/some-action?=baz"
有一个值,其键为string.Empty
,其值为baz
。
如果有多个'='
个字符,那么该键就是第一个'='
之前的所有内容,并且该值就是其后的所有内容。
例如,"/some-controller/some-action?foo=bar=baz"
有一个参数,其密钥为"foo"
,值为bar=baz
。
另一个示例"/some-controller/some-action?eggs==spam"
有一个参数,其键为"eggs"
,值为"=spam"
。
同样支持多个同名参数,如我在其他答案中所暗示的那样。
例如,如果网址为"/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 |
+--------------+--------------+
答案 2 :(得分:7)
如果Request.Url.Query
是您唯一想要的想法,则可以测试?customise
的值。
答案 3 :(得分:1)
ASP.NET不支持确定是否存在没有值的查询字符串参数,因为Request.QueryString["customize"]
和Request.QueryString["foo"]
都是null
。您要么自己解析它,要么指定一个值,例如?customize=1