C# 在ASP.NET中访问没有值的查询字符串参数
我正在尝试设置一个具有两种行为的页面。我通过URL将它们分开:一个行为是通过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.
/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
。您可能会认为是另一种方式,但该表实际上是正确的。上帝只知道微软在用这种方式编码时是怎么想的。