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

Bra*_*ler 28 c# asp.net query-string

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

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

Kev*_*art 71

无钥匙参数

John Sherman的回答只是技术上的正确.不支持不带值的查询参数,但支持不带键的查询值.

换句话说,"/some-controller/some-action?customize"被认为是具有一个查询参数的URL,其值为"customize",并且没有密钥(即密钥null).

检索

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

空参数

空参数(如中所示"?foo=bar&&spam=eggs")将显示为string.Empty带有键的值null,如尾随的那样"&".

"?&"例如,相当不寻常的查询字符串将显示为两个值string.Empty,两者都具有键null.

空查询字符串

有一个边缘表壳不适合图案.这是empy但现在的查询字符串(例如"/ some-controller/some-action?").基于先前显示的模式,它将具有一个值,即string.Empty具有键的值null.但是,实际上它没有价值.


Kev*_*art 27

其他查询参数信息

虽然不是这个问题的直接部分,但这些附加信息也可能有用.

分离器角色

ASP.NET不支持分离的查询参数';',W3C 建议服务器支持这些参数作为替代'&'.

以"="开头的参数

以...开头的查询参数'='被认为具有密钥string.Empty.不要把它与一把钥匙混淆null.例如,"/some-controller/some-action?=baz"有一个值为key string.Empty且值为的值baz.

超过一个"="字符

如果有多个'='字符,那么键就是第一个字符之前的所有字符'=',并且值就是它之后的所有字符.

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

另一个示例"/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 |
+--------------+--------------+    
Run Code Online (Sandbox Code Playgroud)

  • 您会认为这是另一种方式,但该表实际上是正确的.上帝只知道帽子微软在他们用这种方式编码时的想法.我们都直观地期望具有空值的键.叹. (3认同)

Rob*_*Day 7

您可以测试Request.Url.Queryif 的值?customise是您唯一想要的.


Joh*_*han 1

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

  • 更有趣的是,如果您执行 Request.QueryString.ToString(),它会显示密钥! (5认同)
  • http://stackoverflow.com/a/7519540/49942展示了一种方法,它确实有效:您认为的“无值”参数可以作为“无键”参数进行查询。 (3认同)
  • 经过搜索后,QueryString 字典值似乎只填充了同时具有名称和值的参数,因此 HasKey 将不起作用。 (2认同)
  • 的确。不过,特别有趣的是,如果您确实提供了“?customize”查询字符串,QueryString 字典将填充单个键,但它在集合中为空——无论什么,它都没有相关值原因。我认为有点奇怪的行为! (2认同)