Форма HTML: почему действие не может получить в нем значение?

Когда я пробую следующую структуру, он не отправляет id=value

<form action="some.php?id=value" method="get">
   <input name="name1" value="value1">
   <input type="submit">
</form>

Я знаю, что могу отправить id=value в скрытое поле, но интересно, почему он не допускает такую ​​структуру?

Ответ 1

Это потому, что раздел "method = get" формы подразумевает, что значения запроса должны поступать из значений формы.

Коллекция, содержащая "id = значение", переопределяется коллекцией, содержащей значения формы.

Такое поведение, похоже, встроено в каждый браузер, поэтому я ожидаю, что это часть спецификации HTML.

Обновление

Аха:

Об этом спрашивали: отправка формы GET с параметрами строки запроса и скрытыми параметрами исчезают

Цитата:

Как указано в спецификациях (RFC1866, стр. 46; HTML 4.x раздел 17.13.3):

Если метод "get" и действие является URI HTTP, пользовательский агент принимает значение действия, добавляет `? ' к нему, затем добавляет набор данных формы, закодированный с использованием типа контента "application/x-www-form-urlencoded".

Ответ 2

Если ваш метод формы POST, то вы не увидите id как часть значений POSTED, вы можете использовать коллекцию QueryString для доступа к ней.

Ответ 3

Не так ли, потому что это отправит запрос на

some.php?id=vaule?name1=value1

вместо

some.php?id=vaule&name1=value1?

Насколько я знаю, строка запроса содержит только один символ?? и "?" добавляется к URL-адресу при использовании параметров GET.

Ответ 4

Что вы пытаетесь сделать? Какова цель этого? Если вы установите метод своей формы в "GET", а затем получите скрытое поле в своей форме с именем "id", оно добавит переменные get в конец действия и создаст для вас URL-адрес.

Обновить: если браузер разрешил параметры querystring оставаться при добавлении параметров из a из GET, тогда может быть столкновение между именами. Вы можете легко добавить еще один параметр querystring в URL-адрес, не понимая, что он сталкивается с именем ввода формы.

Чтобы избежать этого, если вы используете действие GET в своих формах, передайте все дополнительные параметры как скрытые входы.

Ответ 5

Задание значений в URI действия не будет иметь эффекта, поскольку значения в URI будут переопределены. Чтобы продемонстрировать, попробуйте HTML и PHP-код ниже. Файл form_test.html можно переименовать, но, очевидно, PHP script нужно называть regurgitate.php(или действие в форме нужно отредактировать).

form_test.html

<html>
<head>
<title>Test of setting form action url</title>
<body>
<form action="regurgitate.php?id=value" method="get">
<input type="submit" name="Submit">
<input type="hidden" id="test" name="test" value="test">
</form>
</body>

regurgitate.php

<html>
<head>
<title>Test PHP скрипт for testing form action</title>
<body>
<?php
echo "In regurgitate.php<br>\n";

foreach ($_GET as $k) {
  echo "\$_GET['$k']: >" . $_GET["$k"] . "<<br>\n";
}

?>
</body>

Когда кнопка отправки нажата на form_test.html, URL-адрес моего браузера будет выглядеть примерно так:

http://www.example.com/regurgitate.php?Submit=Submit+Query&test=test

Обратите внимание, что в URL-адресе нет "id = value".

Вывод:

В regurgitate.php
$ _GET ['Отправить запрос']: > <
$ _GET ['test']: > test <

Ответ 6

Работайте, если вы знаете, что SUPERGLOBALS вы собираетесь использовать, попробуйте это

<?php 
if (isset($_GET['id'])) echo "<input type='hidden' name='id' value='" . $_GET['id'] . "'/>";
?>

Поместите это где угодно в вашей форме, и это добавит вам скрытое поле. Работает для меня.

Если предыдущая страница не содержала запрос, то php игнорирует добавление скрытого поля

Ответ 7

Такое поведение действительно раздражает. Одним из способов является полное удаление формы и создание вашего URL вручную на стороне клиента.

Я использовал jQuery в одном из наших проектов .NET для достижения этого. Это маска поиска с десятками параметров. Одним из них является диапазон ползунка (мин/макс). Вы используете ползунок для выбора двух значений и должны нажать на кнопку поиска рядом с ним.

<!-- Input fields (slider code removed) -->
<div class="input-fields">
    @(Model.Unit) <input type="text" id="@(sliderMinId)" value="@(sliderSelMinVal)" />
    to @(Model.Unit) <input type="text" id="@(sliderMaxId)" value="@(sliderSelMaxVal)" />
    <input type="button" id="@(sliderButton)" value="Search" />
</div>

И обработчик события для кнопки:

UrlHelper h = UrlHelperExtensions.CreateRequestAgnosticUrlHelper();

/* Search-Button Click-EventHandler */
$("#@(sliderButton)").click(function(){
     @{
      string url = h.Action("Index", "SearchAction", new RouteValueDictionary(searchParams));
      string urlSeparator = url.Contains("?") ? "&" : "?";
     }
     var url = '@Html.Raw(url + urlSeparator + sliderInfo.AssociatedFieldName)=' + $("#@Html.Raw(sliderMinId)").val() + '%20-%20' + $("#@Html.Raw(sliderMaxId)").val();
     window.location.replace(url);
});

Вот что происходит:

  • Создайте Url, содержащий все предыдущие параметры.
  • Приложите к нему новые параметры формы. В этом случае они добавляются как один параметр (min-max). Не позволяйте этому путать вас.
  • Перенаправление на новый URL.

Это абсолютно неудобно для чего-то, что может быть так просто... Надеюсь, это поможет.