当我尝试以下结构时,它不会发送id=value
<form action="some.php?id=value" method="get">
<input name="name1" value="value1">
<input type="submit">
</form>
我知道我可以在隐藏的字段中发送id=value
,但有趣的是,它为什么不允许这样的结构?
答案 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);
});
这就是:
对于可能如此简单的事情来说,这是非常尴尬的......我希望这会有所帮助。