【问题标题】:Access Query string parameters with no values in ASP.NET在 ASP.NET 中访问没有值的查询字符串参数
【发布时间】:2010-06-28 06:47:49
【问题描述】:

我正在尝试设置具有两种行为的页面。我通过 URL 将它们分开:一种行为是通过/some-controller/some-action 访问的,另一种是通过/some-controller/some-action?customize 访问的。

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

【问题讨论】:

    标签: c# asp.net query-string


    【解决方案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 的键。

    空查询字符串

    有一个边缘案例不适合该模式。那是空的但存在的查询字符串(例如“/some-controller/some-action?”)。根据前面显示的模式,它将有一个值,即string.Empty,键为null。但是,实际上它没有任何值。

    【讨论】:

      【解决方案2】:

      其他查询参数信息

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

      分隔符

      ASP.NET 不支持由 ';' 分隔的查询参数,服务器支持的 W3C recommends 可替代 '&'

      以“=”开头的参数

      '=' 开头的查询参数被认为有一个键,即string.Empty。不要将此与null 的键混淆。例如"/some-controller/some-action?=baz" 有一个值,其键为string.Empty,其值为baz

      多个“=”字符

      如果有多个'=' 字符,则key 是第一个'=' 之前的所有字符,value 是它之后的所有字符。

      例如"/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 |
      +--------------+--------------+    
      

      【讨论】:

      • key: null value: edit 由于解析&edit& 看起来很奇怪。我想反之亦然 - 键:edit 值:null.
      • 您会认为情况正好相反,但该表实际上是正确的。上帝只知道微软以这种方式编码时的想法。我们都直观地期待一个具有空值的键。叹息。
      【解决方案3】:

      如果?customise 是您要寻找的唯一想法,您可以测试Request.Url.Query 的值。

      【讨论】:

      • 我认为这是最好的解决方案。我刚刚做了Request.Url.Query.StartsWith()。在处理语义 URL 时,开箱即用的支持真的很棒!
      • @Toft:您的方法仅在您将“customize”作为唯一参数时才有效。我用过:bool hasCustomise = context.Request.Url.Query.Split(new char[] { '&', '?' }).Contains("customise");(您需要在页面中使用System.Linq;。)
      【解决方案4】:

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

      【讨论】:

      • 突然意识到我可能错了,有可能做到Request.QueryString.HasKey("customize"),但我记得过去走这条路却找不到解决方案
      • 四处搜索后,看起来 QueryString 字典值仅填充了具有名称和值的参数,因此 HasKey 不起作用。
      • 确实如此。不过,特别有趣的是,如果您确实提供了一个 ?customize 查询字符串,QueryString 字典将填充一个键,但它在集合中为空 - 无论出于何种原因,它都没有相关值.我认为这是一种奇怪的行为!
      • 更有趣的是,如果你做Request.QueryString.ToString(),它会显示关键!
      • stackoverflow.com/a/7519540/49942 展示了一种方法,它确实有效:您认为“无价值”的参数可以作为“无键”参数进行查询。
      猜你喜欢
      • 2010-10-10
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多