模型绑定与禁用文本框

mod*_*bie 40 asp.net asp.net-mvc model-binding

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

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

在我的行动中

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

        ...

        return View(model);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*ock 60

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

  • 哇,我简直不敢相信我之前没有碰到这个,或者完全忘记了它.谢谢. (3认同)
  • <%= Html.Hidden("Username",Model.Form.Username)%> <%= Html.Label(Model.Form.Username)%>这可能是更好的用法 (3认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

  • 来到这里是因为我对下拉框有同样的问题,因为未来的ppl readonly不适用于下拉列表:) (2认同)

Dan*_*plo 5

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


Kha*_*ied 5

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

<%= Html.Hidden("Username", Model.Form.Username)%>
Run Code Online (Sandbox Code Playgroud)