【问题标题】:How do I submit disabled input in ASP.NET MVC?如何在 ASP.NET MVC 中提交禁用的输入?
【发布时间】:2011-02-11 15:25:57
【问题描述】:

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

【问题讨论】:

  • 通常您需要将您的问题表述为问题,然后单独发布答案。投票结束;建议您将“答案”部分移至实际答案。
  • 我相信@Dhaval 的帖子正是因为您的问题中有禁用词而得到的答案。

标签: c# .net javascript asp.net-mvc


【解决方案1】:

你不能用readonly="readonly" 代替disabled="disabled" 吗?只读字段值将提交给服务器,同时用户仍不可编辑。 SELECT 标签是个例外。

【讨论】:

  • readonly 有效,但不会使该字段变灰。这是我正在使用的一个示例:<%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %> 我怎样才能将其变灰,以便在视觉上看起来无法编辑。更好的是,我们可以使用类似于 LabelFor 的东西吗,我尝试了 LabelFor,但它只获得了 DisplayName....
  • 4 年做 .net asp,我从来不知道禁用的输入不会得到 poste 回...这是怎么通过我的?只需为禁用的选择包含一个隐藏字段,并将其全部排序。(即使 ID 在不允许的表单上重复)
  • 这也不适用于type="checkbox" 输入
  • 我正在尝试对单选按钮做同样的事情,但 readonly 似乎对它们不起作用。
【解决方案2】:

感谢大家:

我解决这个问题的方法:

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

注意:

我得到了这个关于答案的信息,但我被编辑了。

【讨论】:

  • 这对我来说不太好用(感谢 this SO link)。这有效:textBox.Attributes.Add("readonly", "readonly"); 并且解释在链接中
  • 你编辑它很好,因为这对我来说更有意义。
  • readonly 似乎是要走的路。它不会做奇怪的事情,例如不将控件放回原处,但不允许对其进行编辑。穆哈斯·格拉西亚斯!
  • 添加到 Michael Brennt 的评论中,如果您使用 jQuery,第二行变为 $("#textBoxId").css("color", "#c0c0c0")
【解决方案3】:

@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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 是的,我正在考虑做你建议的事情。但我将不得不处理更多的变量。我希望我的帖子可能会出现在谷歌上,人们不必受苦,寻找一个简单的解决方案。
    • 您的解决方案的一个问题是,如果禁用 javascript,它会中断。服务端注入隐藏字段就没有这个问题了。
    【解决方案5】:

    您也可以在表单提交之前使用这样的代码:

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

    【讨论】:

    • 我用过这个,不用担心隐藏元素,不知道有没有什么缺点,除了可能由于js功能导致回发略有延迟
    • 针对许多提到使用只读而不是禁用的答案我相信在很多情况下我们需要使用禁用,我在类似问题中阅读了大约 15 个答案并选择了这个只是用自己的 jQuery 过滤器来选择删除禁用属性的适当元素,非常感谢。
    • 如果您使用Ajax.BeginForm提交怎么办?
    • 看起来有点奇怪,但它是唯一对我有用的解决方案......
    • 绝对华丽的解决方案!
    【解决方案6】:

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

    要么让他们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>
    

    【讨论】:

      【解决方案7】:

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

      CSS

      .disabled {
          background-color:lightgray;
      }
      

      编辑器模板

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

      【讨论】:

        【解决方案8】:

        这将有助于在 ASP.net 中提交模型值:

        $("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
        

        【讨论】:

        【解决方案9】:

        当我们处理禁用但选中的复选框并且我们想要发布值时,我们需要确保我们的隐藏字段出现在 @Html.CheckBoxFor 隐藏字段之前。

        以下是我找到答案的链接。 http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033

        【讨论】:

          【解决方案10】:

          我通常对 CheckBox 或 CheckBoxFor 使用这种方式,因为禁用它会导致丢失值。 Readonly 也不适用于复选框。

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

          【讨论】:

          • 这帮助我创建了一个只读的“评论”页面,点击“提交”按钮即可发布该页面。谢谢。
          【解决方案11】:

          扩展 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
          });
          

          【讨论】:

          • 查看@tasos 的回答 $(":disabled", $('#frmMain')).removeAttr("disabled");
          【解决方案12】:

          只需将此脚本放在页面的@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>

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-28
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              • 2011-02-14
              • 2022-01-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多