提问人:hazzik 提问时间:9/9/2011 最后编辑:hazzik 更新时间:3/16/2023 访问量:260320
禁用的表单输入不会显示在请求中
Disabled form inputs do not appear in the request
问:
我在表单中有一些禁用的输入,我想将它们发送到服务器,但 Chrome 将它们从请求中排除。
在不添加隐藏字段的情况下,是否有任何解决方法?
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<!-- this does not appear in request -->
<input type="textbox" name="Percentage" value="100" disabled="disabled" />
</form>
答:
带有该属性的元素未提交,或者您可以说其值未发布(请参阅HTML 5规范中步骤3下的第二个要点,以构建表单数据集)。disabled
即,
<input type="textbox" name="Percentage" value="100" disabled="disabled" />
仅供参考,根据 HTML 4 规范中的 17.12.1:
- 禁用的控件不会获得焦点。
- 在 Tab 键导航中跳过禁用的控件。
- 禁用的控件无法成功发布。
您可以在您的案例中使用属性,通过这样做,您将能够发布字段的数据。readonly
即,
<input type="textbox" name="Percentage" value="100" readonly="readonly" />
仅供参考,根据 HTML 4 规范中的 17.12.2:
- 只读元素接收焦点,但不能由用户修改。
- 只读元素包含在 Tab 键导航中。
- 只读元素已成功发布。
评论
如果您绝对必须禁用该字段并传递数据,则可以使用 javascript 将相同的数据输入到隐藏字段中(或者也只是设置隐藏字段)。这将允许您禁用它,但即使您将发布到另一个页面,仍会发布数据。
评论
使用 Jquery 并使用 ajax 发送数据,您可以解决您的问题:
<script>
$('#form_id').submit(function() {
$("#input_disabled_id").prop('disabled', false);
//Rest of code
})
</script>
评论
cursor:not-allowed;
我正在更新这个答案,因为它非常有用。只需将只读添加到输入即可。
因此,表单将是:
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<input type="textbox" name="Percentage" value="100" readonly/>
</form>
您可以完全避免禁用,这很痛苦,因为 html 表单格式不会发送任何与标签或其他标签相关的内容。<p>
所以你可以把常规的
<input text tag just before you have `/>
添加这个readonly="readonly"
它不会禁用您的文本,但不会因用户而更改,因此它的工作方式类似于并通过表单发送价值。如果您想让它更像标签,只需删除边框即可<p>
<p>
除了启用的输入之外,要发布禁用输入的值,您只需在提交表单时重新启用表单的所有输入即可。
<form onsubmit="this.querySelectorAll('input').forEach(i => i.disabled = false)">
<!-- Re-enable all input elements on submit so they are all posted,
even if currently disabled. -->
<!-- form content with input elements -->
</form>
如果您更喜欢 jQuery:
<form onsubmit="$(this).find('input').prop('disabled', false)">
<!-- Re-enable all input elements on submit so they are all posted,
even if currently disabled. -->
<!-- form content with input elements -->
</form>
对于 ASP.NET MVC C# Razor,可以添加提交处理程序,如下所示:
using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post,
// Re-enable all input elements on submit so they are all posted, even if currently disabled.
new { onsubmit = "this.querySelectorAll('input').forEach(i => i.disabled = false)" } ))
{
<!-- form content with input elements -->
}
评论
我发现这更容易工作。只读输入字段,然后设置其样式,以便最终用户知道它是只读的。放置在此处的输入(例如来自 AJAX)仍然可以提交,无需额外的代码。
<input readonly style="color: Grey; opacity: 1; ">
从语义上讲,这感觉是正确的行为
我会问自己“为什么我需要提交这个值?"
如果表单上的输入被禁用,则可能不希望用户直接更改值
禁用输入中显示的任何值都应为
- 从生成表单的服务器上的值输出,或者
- 如果表单是动态的,则可以根据表单上的其他输入进行计算
假设处理表单的服务器与提供表单的服务器相同,则在处理表单时应提供用于重现已禁用输入值的所有信息
事实上,为了保持数据完整性 - 即使禁用的输入的值已发送到处理服务器,您也应该对其进行验证。此验证需要的信息级别与重现值所需的信息级别相同!
我几乎认为只读输入也不应该在请求中发送
很高兴得到纠正,但我能想到的所有需要提交只读/禁用输入的用例实际上都只是变相的样式问题
评论
除了 Tom Blodget 的回复之外,您还可以简单地添加 @HtmlBeginForm 作为表单操作,如下所示:
<form id="form" method="post" action="@Html.BeginForm("action", "controller", FormMethod.Post, new { onsubmit = "this.querySelectorAll('input').forEach(i => i.disabled = false)" })"
评论
@Html.BeginForm(...) {...}
<form ...> ... </form>
@Url.Action("action", "controller")
使用 RGBA 值定义颜色
在样式下添加以下代码
<!DOCTYPE html>
<html>
<head>
<style>
#p7 {background-color:rgba(215,215,215,1);}
</style>
</head>
<body>
禁用 灰色 无 传输
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<!-- this does not appear in request -->
<input id="p7" type="textbox" name="Percentage" value="100" readonly="readonly"" />
</form>
简单的解决方法 - 只需使用隐藏字段作为选择、复选框和单选的占位符。
从此代码到 -
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<!-- this does not appear in request -->
<input type="textbox" name="Percentage" value="100" disabled="disabled" />
<select name="gender" disabled="disabled">
<option value="male">Male</option>
<option value="female" selected>Female</option>
</select>
</form>
该代码 -
<form action="/Media/Add">
<input type="hidden" name="Id" value="123" />
<input type="textbox" value="100" readonly />
<input type="hidden" name="gender" value="female" />
<select name="gender" disabled="disabled">
<option value="male">Male</option>
<option value="female" selected>Female</option>
</select>
</form>
用
<input type="textbox" name="" value="100" disabled/>
或
<input type="textbox" name="" value="100" readonly/>
如果您使用的是像 PHP Laravel 这样的框架,则没有 name 属性的元素将读取为 unset
<input type="textbox" value="100" disabled/>
我遇到了完全相同的问题,但对我不起作用,因为我选择了 HTML 元素,并且它是只读状态,允许更改其值。 所以我在一个条件中使用了 select,在另一个条件中使用了 input:
<% If IsEditWizard Then %>
<%For Each item In GetCompaniesByCompanyType("ResponsibleEntity")%>
<% If item.CompanyCode.EqualsIgnoreCase(prCompany.GetAsString("LinkedCompany")) Then %>
<input type="text" value="<%: item.CompanyName %>" tabindex="3" size="12" maxlength="12" readonly="readonly" />
<input type="hidden" id="LinkedCompany" name="LinkedCompany" value="<%:item.CompanyCode %>" tabindex="3" size="12" maxlength="12" />
<%End If %>
<%Next %>
<%Else %>
<select id="LinkedCompany" name="LinkedCompany" class="w-auto" <%= If(IsEditWizard, "disabled", "") %>>
<option value="">Please Select</option>
<%For Each item In GetCompaniesByCompanyType("ResponsibleEntity")%>
<option value="<%:item.CompanyCode %>" <%: IIf(item.CompanyCode.EqualsIgnoreCase(prCompany.GetAsString("LinkedCompany")), "selected", String.Empty) %>><%: item.CompanyName %></option>
<%Next %>
</select>
<%End If %>
评论