模型绑定与禁用文本框

时间:2010-04-16 13:58:06

标签: asp.net asp.net-mvc model-binding

我有一个我定义为

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

在我的行动中

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

        ...

        return View(model);
    }

post.Username将为空,所有其他属性都正确绑定,但如果我将@ disabled =“disabled更改为@ readonly =”readonly“用户名绑定正确且一切正常。

看起来模型绑定会忽略禁用字段中的值。他们是这样的吗?我仍然需要字段的值来绑定到模型。我可以使用readonly但更喜欢使用disabled,因此用户在视觉上可以看出他们无法编辑该字段的值。

7 个答案:

答案 0 :(得分:58)

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

答案 1 :(得分:51)

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

您可以通过添加具有相同值的隐藏字段来执行解决方法;)

<%= Html.Hidden("Username", Model.Form.Username)%>

答案 4 :(得分:4)

正如评论中所建议的那样,readonly而不是disabled可以是一个选项,但它不适用于选择框。您可以保留输入或选择为已禁用,而不是创建隐藏输入,并通过在提交时使用JavaScript更改disabled属性来传递数据。

使用jQuery,它看起来像这样:

$('form').on('submit', function(){
    $('input, select').prop('disabled',false);
    return true;
});

答案 5 :(得分: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);
    });

});

答案 6 :(得分:0)

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

ReadOnly attribute doesn't work in ASP.NET MVC Models