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

当前回答

带有disabled属性的元素不会被提交,或者您可以说它们的值没有被发布(参见HTML 5规范中关于构建表单数据集的步骤3下的第二个要点)。

也就是说,

<input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

供参考,根据HTML 4规范中的17.12.1:

禁用控件无法接收焦点。 在选项卡导航中跳过禁用控件。 无法成功张贴已禁用的控件。

你可以使用readonly属性在你的情况下,通过这样做,你将能够发布你的字段的数据。

也就是说,

<input type="textbox" name="Percentage" value="100" readonly="readonly" />

供参考,根据HTML 4规范中的17.12.2:

只读元素接收焦点,但用户不能修改。 选项卡导航中包含只读元素。 只读元素被成功发布。

其他回答

你可以完全避免禁用,这是痛苦的,因为html表单格式不会发送任何相关的<p>或一些其他标签。

所以你可以写成regular

<input text tag just before you have `/>

添加这个 只读的=“readonly”

它不会禁用您的文本,但不会由用户更改,因此它像<p>一样工作,并将通过表单发送值。如果你想让它更像<p>标签,只需删除边框

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

所以形式是:

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />
    <input type="textbox" name="Percentage" value="100" readonly/>
</form>

use

<input type="textbox" name="" value="100" disabled/>

or

<input type="textbox" name="" value="100" readonly/>

如果你使用像PHP Laravel这样的框架,没有name属性的元素将读为unset

<input type="textbox" value="100" disabled/>

简单的解决方法-只是使用隐藏字段作为选择,复选框和无线电占位符。

从这个代码到-

<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>

除了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)" })"