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

时间:2010-06-28 06:47:49

标签: c# asp.net query-string

我正在尝试设置一个包含两个行为的页面。我用URL分隔它们:一个行为是通过/some-controller/some-action访问的,另一个是通过/some-controller/some-action?customize访问的。

当我访问第二个URL时,它看起来不像Request.QueryString对象包含任何东西......我的意思是,密钥集合中有一个元素,但它是null,而不是{ {1}}。任何人对此有任何想法或如何启用此功能。我想避免不惜一切代价手动解析查询字符串:)。

4 个答案:

答案 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