Форма 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.
Это абсолютно неудобно для чего-то, что может быть так просто... Надеюсь, это поможет.