【发布时间】:2011-02-11 15:25:57
【问题描述】:
如何在 ASP.NET MVC 中提交禁用的输入?
【问题讨论】:
-
通常您需要将您的问题表述为问题,然后单独发布答案。投票结束;建议您将“答案”部分移至实际答案。
-
我相信@Dhaval 的帖子正是因为您的问题中有禁用词而得到的答案。
标签: c# .net javascript asp.net-mvc
如何在 ASP.NET MVC 中提交禁用的输入?
【问题讨论】:
标签: c# .net javascript asp.net-mvc
你不能用readonly="readonly" 代替disabled="disabled" 吗?只读字段值将提交给服务器,同时用户仍不可编辑。 SELECT 标签是个例外。
【讨论】:
<%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %> 我怎样才能将其变灰,以便在视觉上看起来无法编辑。更好的是,我们可以使用类似于 LabelFor 的东西吗,我尝试了 LabelFor,但它只获得了 DisplayName....
type="checkbox" 输入
感谢大家:
我解决这个问题的方法:
document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";
注意:
我得到了这个关于答案的信息,但我被编辑了。
【讨论】:
textBox.Attributes.Add("readonly", "readonly"); 并且解释在链接中
$("#textBoxId").css("color", "#c0c0c0")。
@ppumkin 在他对this answer 的评论中提到了这一点,但我想强调它,因为我无法找到其他资源来从禁用的<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。
【讨论】:
通常,如果我有一个“只读”字段但需要提交回服务器,我将禁用显示(或简单的文本),然后添加一个具有相同名称的隐藏字段。您仍然需要确保该字段实际上并未在服务器端进行修改——只是不要在您的操作中从模型更新它——但如果出现错误,模型状态仍然是准确的。
【讨论】:
您也可以在表单提交之前使用这样的代码:
$(":disabled", $('#frmMain')).removeAttr("disabled");
【讨论】:
Ajax.BeginForm提交怎么办?
根据设计,浏览器不支持。
要么让他们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>
【讨论】:
您可以创建如下所示的编辑器模板
CSS
.disabled {
background-color:lightgray;
}
编辑器模板
@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })
【讨论】:
这将有助于在 ASP.net 中提交模型值:
$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
【讨论】:
当我们处理禁用但选中的复选框并且我们想要发布值时,我们需要确保我们的隐藏字段出现在 @Html.CheckBoxFor 隐藏字段之前。
以下是我找到答案的链接。 http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033
【讨论】:
我通常对 CheckBox 或 CheckBoxFor 使用这种方式,因为禁用它会导致丢失值。 Readonly 也不适用于复选框。
@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)
【讨论】:
扩展 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
});
【讨论】:
只需将此脚本放在页面的@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>
【讨论】:
只需在链接到该视图的 ViewModel 中将该属性设为 [必需]。
【讨论】: