45

我有一个我定义为的文本框

<%= Html.TextBox("Username", Model.Form.Username, 
        new { @class = "textbox", @disabled = "disabled" })%>

动作定义为

    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public ActionResult EditLogin(LoginForm post) {

        ...

        return View(model);
    }

当我发布到这个时,Username将是空白的。所有其他属性都正确绑定,但是如果我更改@disabled="disabled"@readonly="readonly"用户名正确绑定并且一切正常。

看起来模型绑定忽略了禁用字段中的值。有没有解决的办法?我仍然需要将字段的值绑定到模型。我可以使用只读但更喜欢使用禁用,因此用户可以直观地看出他们无法编辑字段的值。

4

7 回答 7

67

我相信禁用的表单字段不会提交任何内容。如果您有一个表单并禁用该表单中的 foo 字段,则在您发布帖子时将没有 foo 字段的值。这只是在 HTML 中禁用字段的本质,而不是 MVC 问题。

于 2010-04-16T14:24:52.440 回答
60

使用readonly- 将禁用输入,但您仍然可以在绑定中使用它。您可以在 div 上应用样式以使其看起来变灰?

<div class="editor-label">
  @Html.LabelFor(model => model.FileName)
</div>
<div class="editor-field-greyed-out">
  @Html.TextBoxFor(model => model.FileName, new { @readonly = true })
  @Html.ValidationMessageFor(model => model.FileName)
</div>
于 2012-03-23T13:42:00.017 回答
5

如果您希望将值发回但不可编辑,请考虑将其放置在隐藏字段中。显然,不要对任何需要一定程度的安全性的东西这样做,因为用户可以篡改它。

于 2010-04-16T14:30:51.217 回答
4

您可以通过添加具有相同值的隐藏字段来解决问题;)

<%= Html.Hidden("Username", Model.Form.Username)%>
于 2013-06-18T19:30:42.493 回答
4

正如评论中所建议的,只读而不是禁用可以是一个选项,但它不适用于选择框。除了创建隐藏输入之外,您还可以将输入或选择保持为禁用状态,并且仍然可以通过在提交时使用 JavaScript 更改禁用属性来传递数据。

使用 jQuery 它看起来像这样:

$('form').on('submit', function(){
    $('input, select').prop('disabled',false);
    return true;
});
于 2017-06-15T15:16:35.720 回答
1

提交禁用字段的最简单方法是在提交之前将它们复制到不可见的非禁用控件。有些人手动创建这些控件并连接到 jQuery 中的 on change 事件以按需复制它们,但下面的这个解决方案是通用的、简单的且不那么健谈 - 尽管有一条规则:您必须在回发后创建(呈现)一个干净的页面(所以

$('#submitBtn').closest('form').one('submit', function() {

    var $form = $(this);

    // input, textarea, select, option, ----- button, datalist, keygen, output, optgroup
    $form.find('input:disabled, textarea:disabled, select:disabled, option:disabled').each(function () {

        var $item = $(this);

        var hiddenItem = $item.clone();
        hiddenItem.removeAttr('id');
        hiddenItem.removeAttr('disabled');
        hiddenItem.attr('style', 'display: none');

        $item.after(hiddenItem);
    });

});
于 2016-05-18T05:10:03.840 回答
0

@readonly = true 在我的页面上不起作用。我做了额外的研究。这是解释它的文章

ReadOnly 属性在 ASP.NET MVC 模型中不起作用

于 2017-02-09T22:27:39.667 回答