禁用的表单输入不会出现在请求中

haz*_*zik 313 html browser forms http

我在表单中有一些禁用的输入,我想将它们发送到服务器,但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>
Run Code Online (Sandbox Code Playgroud)

Alp*_*ale 688

"已禁用元素"属性未提交,或者您可以说它们的值未发布(请参阅规范中步骤3中第二个项目符号,以构建表单数据集).

也就是说,

<input type="textbox" name="Percentage" value="100" disabled="disabled" /> 
Run Code Online (Sandbox Code Playgroud)

仅供参考,

  1. 禁用的控件无法获得焦点.
  2. 标签导航中会跳过已禁用的控件.
  3. 禁用的控件无法成功发布.

您可以readonly在您的案例中使用属性,这样您就可以发布您的字段数据.

也就是说,

<input type="textbox" name="Percentage" value="100" readonly="readonly" />
Run Code Online (Sandbox Code Playgroud)

仅供参考,

  1. 只读元素获得焦点,但用户无法修改.
  2. 标签导航中包含只读元素.
  3. 只读元素已成功发布.

  • readonly似乎不适用于选择类型. (17认同)
  • 你有没有发现一些东西并想,*“到底是什么让他们认为这很明显?”*如果我遇到麻烦,包括一个可能被禁用或可能不被禁用的输入字段,这意味着我没有希望 **user** 改变它,而不是它应该有效地表现得好像它从未被声明过一样! (7认同)
  • 回答我自己的问题:不,_readony_仅适用于<input />表单控件的type ='text'和type ='password'以及<textarea />.readonly的作用是阻止用户更改控件值.防止用户更改复选框的值(或类型无线电的输入)没有多大意义...... (5认同)
  • @ danielson317您可以保持select元素"禁用",但也可以添加另一个具有相同值的隐藏输入. (2认同)
  • 谢谢你,这很有帮助,无论是答案还是回应。 (2认同)
  • @NickBedford,尤其是当您认为“哦,我可以通过添加禁用属性来快速安全地处理这个问题”。 (2认同)

Lip*_*uga 23

使用Jquery并使用ajax发送数据,您可以解决您的问题:

<script>

$('#form_id').submit(function() {
    $("#input_disabled_id").prop('disabled', false);

    //Rest of code
    })
</script>
Run Code Online (Sandbox Code Playgroud)

  • @ArielMaduro,你可以用css` cursor:not-allowed;`做到这一点 (4认同)

小智 7

如果您必须禁用该字段并传递数据,则可以使用javascript将相同的数据输入到隐藏字段中(或者也可以设置隐藏字段).这将允许您将其禁用但仍然发布数据,即使您要发布到另一个页面.


Tom*_*get 7

除了启用输入之外,要从禁用输入中发布值,您只需在提交时重新启用所有表单的输入.

<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>
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢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>
Run Code Online (Sandbox Code Playgroud)

对于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 -->
}
Run Code Online (Sandbox Code Playgroud)


Lim*_*mon 6

我正在更新这个答案,因为它非常有用。只需将 readonly 添加到输入即可。

所以形式将是:

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />
    <input type="textbox" name="Percentage" value="100" readonly/>
</form>
Run Code Online (Sandbox Code Playgroud)