为什么此查询字符串无效?

时间:2008-11-19 15:23:55

标签: asp.net-mvc invalid-url

在我的asp.net mvc页面中,我创建了一个呈现如下链接的链接:

http://localhost:3035/Formula/OverView?colorId=349405&paintCode=744&name=BRILLANT%20SILVER&formulaId=570230

根据W3C验证器,这是不正确的,并且在第一个&符号后出错。它抱怨&未被编码且实体& p未被识别等。

AFAIK&不应编码,因为它是键值对的分隔符。

对于那些关心的人:我将这些文件作为查询字符串而不是“/”分隔值发送,因为没有像我所知的传递可选参数的好方法。

将所有位放在一起:

  • 锚(< a>)标记的href属性需要编码值
  • &安培;编码为& amp;
  • 编码'&'如果它是参数值的一部分,请使用%26

不会将&符号编码为&把它作为我参数值的一部分? 我需要它来分离第一个

中的第二个变量

实际上,通过编码我的href值,我确实摆脱了错误。我现在想知道的是,例如我的colorId将是“123& 456”,其中&符号是值的一部分。 由于必须对分隔符进行编码,因此如何处理编码的&符号。他们需要编码两次这么说吗?

所以要获取网址:

www.mySite.com/search?query=123&456&page=1

我的href值应该是多少?

此外,我认为我是世界上第一个关心这个问题的人。去检查www并计算在W3C验证器中验证其查询字符串的页面。

3 个答案:

答案 0 :(得分:4)

属性的一部分通常应该被编码。因此,你需要& amp; amp;而不仅仅是&

即使它没有验证也能正常工作,因为大多数浏览器非常非常非常宽容接受。

此外,如果要输出XHTML,则必须对每个实体进行编码,而不仅仅是在属性内部。

答案 1 :(得分:3)

所有HTML属性都需要使用字符实体。你只需要改变&进入& amp;在脚本块中。

<a href="http://localhost:3035/Formula/OverView?colorId=349405&amp;paintCode=744&amp;name=BRILLANT%20SILVER&amp;formulaId=570230">Whatever</a>

HTML文档中您想要&amp;的任何地方。要直接显示除空白之外的其他内容,您需要使用字符实体&amp; amp ;.如果它是属性的一部分,则&amp; amp;会好像它是&amp ;.如果文档是XHTML,您需要在任何地方使用字符实体,即使您没有紧跟在&amp;旁边的东西。您还可以使用其他字符实体作为属性的一部分来将它们视为实际字符。

如果您想以不同于参数分隔符的方式将&符号用作URL的一部分,则应使用%26。

作为一个例子......

<a href="http://localhost/Hello?name=Bob&amp;text=you%20%26%20me%20&quot;forever&quot;">Hello</a>

会将用户发送到http://localhost/Hello,其名称= Bob和text = you&amp;我“永远”。

答案 2 :(得分:1)

对于某些人来说,这是一个有点混乱的概念,我发现了。当您将&amp;放入HTML页面时(例如<a href="abc?def=5&amp;ghi=10">中),该网址 abc?def=5&ghi=10。 HTML解析器将实体转换为&符号。

想想与如何在字符串中转义引号完全相同:

// though you define your string like this:
myString = "this is \"something\" you know?"

// the string is ACTUALLY: this is "something" you know?

// when you look at the HTML, you see:
<a href="foo?bar=1&amp;baz=2">

// but the url is ACTUALLY: foo?bar=1&bar=2