HTML表单:为什么行动无法获得价值?

时间:2010-08-23 15:01:11

标签: html forms

当我尝试以下结构时,它不会发送id=value

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

我知道我可以在隐藏的字段中发送id=value,但有趣的是,它为什么不允许这样的结构?

7 个答案:

答案 0 :(得分:5)

这是因为表单的“method = get”部分意味着查询值必须来自表单值。

包含“id = value”的集合被包含表单值的集合覆盖。

这种行为似乎内置于每个浏览器中,所以我希望它是HTML规范的一部分。

<强>更新

啊哈:

之前有人问过: submitting a GET form with query string params and hidden params disappear

引用:

根据规范(RFC1866,第46页; HTML 4.x第17.13.3节)说明:

  

如果方法是“get”并且操作是HTTP URI,则用户代理获取action的值,附加“?”然后,使用“application / x-www-form-urlencoded”内容类型附加表单数据集。

答案 1 :(得分:1)

如果您的表单方法是POST,那么您不会将id视为POSTed值的一部分,您可以使用QueryString集合来访问它。

答案 2 :(得分:1)

不是因为这会向

发送请求

some.php?id=vaule?name1=value1

而不是

some.php?id=vaule&name1=value1

据我所知,查询字符串只有一个“?”和一个“?”在使用GET参数时附加到URL。

答案 3 :(得分:0)

你想做什么?这样做的目的是什么?如果您将表单的方法设置为“GET”,然后在表单中使用名称为“id”的隐藏字段,则会将get变量附加到操作的末尾并为您创建一个URL。

更新:如果浏览器在从GET附加params时允许保留查询字符串参数,则名称之间可能会发生冲突。您可以轻松地向URL添加另一个查询字符串参数,而不会发现它与表单输入名称冲突。

为避免这种情况,如果您在表单中使用GET操作,请将所有其他参数作为隐藏输入传递。

答案 4 :(得分:0)

在操作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

请注意,网址中没有“id = value”。

输出结果为:

  

在regurgitate.php中   $ _GET ['提交查询']:&gt;&lt;
  $ _GET ['test']:&gt; test&lt;

答案 5 :(得分:0)

如果您知道要使用的SUPERGLOBALS,请尝试这个

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

将它放在表单的任何位置,它会为您添加隐藏字段。适合我。

如果上一页不包含查询,则php会忽略添加隐藏字段

答案 6 :(得分:0)

这种行为真的很烦人。一种解决方法是完全删除表单并在客户端手动构建您的URL。

我在我们的一个.NET项目中使用了jQuery来实现这一目标。它是一个包含许多参数的搜索掩码。其中之一是范围滑块(最小/最大)值。您可以使用滑块选择两个值,并按下旁边的搜索按钮。

<!-- 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. 构建包含所有先前参数的网址。
  2. 将新的“表单”参数附加到其中。在这种情况下,它们被添加为一个参数(min-max)。不要让这让你感到困惑。
  3. 重定向到新的网址。
  4. 对于可能如此简单的事情来说,这是非常尴尬的......我希望这会有所帮助。