Почему эта строка запроса недействительна? - PullRequest
3 голосов
/ 19 ноября 2008

На моей странице asp.net mvc я создаю ссылку, которая выглядит следующим образом:

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

В соответствии с валидатором W3C, это неверно и выдает ошибки после первого амперсанда. Он жалуется на то, что & не кодируется, а объект & p не распознается и т. Д.

AFAIK код & не должен кодироваться, поскольку он является разделителем для пары ключ-значение.

Для тех, кому не все равно: я отправляю эти параметры в виде строки запроса, а не в виде разделенных "/" значений, потому что не существует достойного способа передачи необязательных параметров, которые мне известны.

Чтобы сложить все биты:

Не кодирует ли амперсанд и не делает ли это частью значения моего параметра? Мне нужно, чтобы отделить вторую переменную от первой

Действительно, кодируя значение href, я избавляюсь от ошибок. Однако сейчас мне интересно, что делать, если, например, мой colorId будет «123 & 456», где амперсанд является частью значения. Поскольку разделитель должен быть закодирован, что делать с закодированными амперсандами. Нужно ли их, так сказать, кодировать дважды?

Итак, чтобы получить URL:

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

Каким должно быть мое значение href?

Кроме того, я думаю, что я первый человек в мире, который позаботится об этом ... иди проверь www и посчитай страницы, которые проверяют строку запроса в валидаторе W3C.

Ответы [ 3 ]

4 голосов
/ 19 ноября 2008

Объекты, которые являются частью атрибутов, как правило, должны быть закодированы. Таким образом, вам нужно & amp; вместо просто &

Это работает, даже если не проверяется, потому что большинство браузеров очень, очень , очень снисходительно относятся к тому, что принимать.

Кроме того, если вы выводите XHTML, вы должны кодировать каждую сущность везде, а не только внутри атрибутов.

3 голосов
/ 19 ноября 2008

Все атрибуты 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; будет работать так, как будто это &. Если документ XHTML, вам нужно везде использовать символьные объекты, даже если у вас нет чего-то рядом с &. Вы также можете использовать другие символьные объекты как часть атрибутов, чтобы обрабатывать их, как если бы они были действительными символами.

Если вы хотите использовать амперсанд как часть URL, а не как разделитель для параметров, вы должны использовать% 26.

Как пример ...

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

Отправит пользователя на http://localhost/Hello, с именем = Боб и текстом = ты и я "навсегда".

1 голос
/ 20 ноября 2008

Я нашел несколько странную концепцию для некоторых людей. Когда вы помещаете &amp; на HTML-страницу, например, <a href="abc?def=5&amp;ghi=10">, URL-адрес будет на самом деле 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...