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

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

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

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

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

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

Чтобы собрать все воедино:

  • атрибут href тега привязки (<a>) требует закодированного значения
  • & кодируется в & amp;
  • чтобы закодировать '&', когда он является частью значения вашего параметра, используйте% 26

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
4 515
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

Вам необходимо кодировать каждую сущность во всех HTML-документах (за некоторыми исключениями, например, внутри тегов сценария). Если в качестве типа документа установить значение XHTML, его страница не будет проверяться.

Illandril 19.11.2008 22:21

Я не имел в виду, что изменение doctype на XHTML исправит это, но, поскольку вы правы, сущности внутри атрибутов должны кодироваться во всех вариантах HTML, я изменил ответ, чтобы отразить это.

Vinko Vrsalovic 19.11.2008 22:40
Ответ принят как подходящий

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

В то время я не мог придумать ничего лучшего, у которого была веская причина использовать пробелы, амперсанд и другую символьную сущность :)

Illandril 21.11.2008 18:41

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

Другие вопросы по теме