与禁用的文本框的模型绑定

我有一个我定义的文本框

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

在我的行动

  [AcceptVerbs(HttpVerbs.Post)] [ValidateAntiForgeryToken] public ActionResult EditLogin(LoginForm post) { ... return View(model); } 

用户名将是空的,所有其他属性绑定正确,但如果我更改@禁用=“禁用@ readonly =”只读“用户名绑定正确,一切正常。

它看起来像模型绑定忽略禁用字段中的值。 他们是否有办法解决这个问题? 我仍然需要该字段的值绑定到模型。 我可以使用只读,但宁愿使用禁用,因此它是在视觉上明显的用户,他们不能编辑字段的值。

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

使用readonly – 将禁用input,但你仍然会在绑定。 也许你可以在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> 

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

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

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

正如评论中所build议的那样,readonly而不是disabled是可以select的,但是它不适用于select框。 您不必创build隐藏的input,而是可以将input或select保留为禁用状态,并通过在提交时使用JavaScript更改禁用的属性来传递数据。

使用jQuery它看起来像这样:

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

提交禁用字段的最简单方法是在提交之前将其复制到不可见的非禁用控件。 有些人手动创build这些控件,然后在jQuery中将它们复制到需要的地方,但是下面这个解决scheme是一般的,简单的,不那么简单的,尽pipe一个规则是:你必须在回发之后创build一个干净的页面所以

 $('#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); }); }); 

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

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

Interesting Posts