如何在ASP.NET MVC中提交禁用的输入?


108

如何在ASP.NET MVC中提交禁用的输入?


3
通常,您需要将问题表达为问题,然后分别发布答案。投票结束;建议您将“答案”部分移至实际答案。
乔治·斯托克

1
我相信@Dhaval帖子正是由于您的问题中的禁用词而恰恰是答案。
QMaster

Answers:


160

您不能readonly="readonly"代替它disabled="disabled"吗?只读字段值将提交给服务器,同时用户仍然无法对其进行编辑。一个SELECT标签是只有一个例外。


1
只读有效,但不会使字段变灰。这是我正在使用的示例:<%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>如何将其变灰以使其看起来像不可编辑。更重要的是我们可以使用类似的东西LabelFor,我试图LabelFor但只得到显示名称....
VoodooChild

22
做.net asp的4年,我从来不知道禁用的输入不会回发...那是如何使我过去的?只需为已禁用的选择添加一个“隐藏”字段并将其全部排序。(即使ID在不允许的表格上重复)
Piotr Kula

5
这对type="checkbox"输入也不起作用
Nathan

1
我正在尝试使用单选按钮执行相同的操作,但只读似乎不适用于它们。
兰迪·R

38

谢谢大家:

我解决这个问题的方式:

document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";

注意:

我在答案中得到了这些信息,但是我被编辑了。


1
这对我来说不是一件好事(由于这个SO链接使它变了)。这有效:textBox.Attributes.Add("readonly", "readonly");并且解释在链接中
brian-d

很好,您可以编辑它,因为这对我来说更有意义。
Yawar

只读似乎是要走的路。它不会做一些奇怪的事情,例如不摆回控件,但不允许对其进行编辑。Muchas Gracias!
Mariusz

要添加到Michael Brennt的评论中,如果您使用的是jQuery,则第二行变为$("#textBoxId").css("color", "#c0c0c0")
F1Krazy

30

@ppumkin在他对这个答案的评论中提到了这一点,但是我想强调一下它,因为我无法找到其他资源来提交来自残疾人的数据<select>。我也认为这与问题有关,因为选择不是<input>s,而是“输入”。

只需为已禁用的选择添加一个“隐藏”字段,并将其全部排序即可。

例:

@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@

注意:这会将两个具有相同ID的标签放在页面上,这并不是真正有效的HTML,可能会引起JavaScript麻烦。对我来说,我有一个javascript通过它的html来设置下拉列表的值id,如果您将隐藏字段放在第一位,则javascript会找到它而不是select


20

通常,如果我有一个“只读”字段但需要提交回服务器,则将禁用显示(或仅显示文本),然后添加一个具有相同名称的隐藏字段。您仍然需要确保在服务器端未真正修改该字段-只是不要在操作中从模型中对其进行更新-但是如果有错误,则模型状态仍然是准确的。


是的,我正在考虑做您要说明的事情。但是我将不得不处理更多的变量。我希望我的帖子可能会出现在google中,而人们不必苦苦寻找简单的解决方案。
桑契托斯

4
您的解决方案的一个问题是,如果禁用了javascript,它就会中断。在服务器端注入隐藏字段不会出现此问题。
tvanfosson

15

您还可以在表单提交之前使用如下代码:

$(":disabled", $('#frmMain')).removeAttr("disabled");

2
我用了这个,不需要担心隐藏的元素,不知道是否有任何缺点,除了由于js函数而在回发时可能会稍有延迟
IronHide 2016年

2
针对提到的使用只读而不是禁用的许多答案,我相信在许多情况下我们需要使用禁用,我阅读了类似问题中的约15个答案,并仅通过自己的jQuery过滤器选择了此选项,以选择适当的元素来删除禁用的属性,很好谢谢。
QMaster

如果您要提交Ajax.BeginForm
markzzz


1
看起来有点奇怪,但这是唯一对我
有用的

8

根据设计,浏览器不支持该功能。

使它们readonly允许将值提交到服务器,或者如果您要处理的控件仍可用于readonly诸如Select之类的属性,请添加CSS样式pointer-events: none;以使其不交互

有点骇客,但是行得通!当您直接使用“提交”按钮而不使用javascript提交表单时,它也可以使用。无需额外的工作!

例如:

<select asp-for="TypeId" 
   asp-items="@(new SelectList(await TypeRepository.FetchTypesAsync(), "TypeId", "Name"))"
   class="form-control form-control-sm" 
   readonly 
   style="pointer-events: none;">
</select>

6

您可以创建如下所示的编辑器模板

的CSS

.disabled {
    background-color:lightgray;
}

编辑器范本

@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })


1

扩展Tasos'(“:disabled”,$('#xxxForm'))。removeAttr(“ disabled”); 您可以使用:

$("#xxxForm").submit(function (e) {
    e.preventDefault();
    var form = this;
    $('#Field1')[0].disabled = false;
    $('#Field2')[0].disabled = false;
    ...
    $('#FieldN')[0].disabled = false;
    form.submit(); // submit bypassing the jQuery bound event
});


0

我通常将这种方式用于CheckBox或CheckBoxFor,因为将其禁用会导致丢失值。只读在复选框上也不起作用。

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)

0

只需将此脚本放在页面的@section脚本中即可。这将在您提交页面时启用输入,并且您应在提交后将用户重定向到另一个页面。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js">
$("form").submit(function () {
                    if ($('form').valid()) {
                        $("input").removeAttr("disabled");
                    }
                });
</script>


-3

只需在链接到该视图的ViewModel中将该属性设置为[Required]。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.