Форма HTML: почему в действии не может быть ценности? - PullRequest
5 голосов
/ 23 августа 2010

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

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

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

Ответы [ 7 ]

5 голосов
/ 23 августа 2010

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

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

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

Обновление

Ахах:

Это спрашивали раньше: отправка формы GET с пропущенными параметрами строки запроса и скрытыми параметрами

Цитировать:

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

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

1 голос
/ 23 августа 2010

Разве это не потому, что это послало бы запрос к

some.php?id=vaule?name1=value1

вместо

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

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

1 голос
/ 23 августа 2010

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

0 голосов
/ 19 февраля 2014

Такое поведение действительно раздражает.Одним из обходных путей является полное удаление формы и создание 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);
});

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

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

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

0 голосов
/ 24 августа 2011

Обходной путь, если вы знаете, какие SUPERGLOBALS вы собираетесь использовать, попробуйте это

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

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

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

0 голосов
/ 23 августа 2010

Указание значений в URI действия не будет иметь никакого эффекта, так как значения в URI будут переопределены.Чтобы продемонстрировать, попробуйте код HTML и PHP ниже.Файл form_test.html можно переименовать, но очевидно, что PHP-сценарий должен называться 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 script 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 ['Submit Query']:> <<br> $ _GET ['test']:> test <</p>

0 голосов
/ 23 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...