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

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

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

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

无钥匙参数

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 。 但是,实际上它没有价值。

其他查询参数信息

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

分离器角色

ASP.NET不支持由';'分隔的查询参数 其中W3C 建议服务器支持作为'&'的替代。

以“=”开头的参数

'='开头的查询参数被认为具有键,即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"

同名的多个参数

同样支持多个同名参数,如我的其他答案中所暗示的那样。

例如,如果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.Url.Query的值,如果?customise是您正在寻找的唯一想法。