Почему эта строка запроса недействительна?

На моей странице asv.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 ответа

Решение

Все атрибуты 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, с именем =Bob и text=you & me "навсегда".

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

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

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

Я нашел, что это немного запутанная концепция для некоторых людей. Когда вы положите &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
Другие вопросы по тегам