Связывание модели с отключенным текстовым полем
У меня есть текстовое поле, которое я определяю как
<%= 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 to @readonly =" readonly ", имя пользователя будет правильно связываться и все будет работать.
Похоже, привязка к модели игнорирует значения в отключенных полях. Их способ обойти это? Мне все еще нужно значение поля для привязки к модели. Я могу использовать readonly, но предпочел бы использовать отключенный, так что визуально очевидно, что пользователь не может редактировать значение поля.
Ответы
Ответ 1
Я считаю, что поле формы, которое отключено, ничего не передает. Если у вас есть форма и отключить поле foo в этой форме, когда вы публикуете сообщение, у него не будет значения для поля foo. Это просто характер отключения поля в HTML и не является проблемой MVC.
Ответ 2
use 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>
Ответ 3
Если вы хотите, чтобы значение было отправлено назад, но не редактировалось, подумайте о его размещении в скрытом поле. Очевидно, не делайте этого ни для чего, требующего определенной степени безопасности, так как пользователь может вмешиваться в него.
Ответ 4
Вы можете сделать обходной путь, добавив скрытое поле с тем же значением;)
<%= Html.Hidden("Username", Model.Form.Username)%>
Ответ 5
Как было предложено в комментариях, readonly вместо отключенного может быть вариантом, но он не будет работать для отдельных блоков. Вместо создания скрытого ввода вы можете сохранить входы или выбрать как отключенные и все еще передавать данные, изменив свойство disabled с помощью JavaScript в submit.
Использование jQuery будет выглядеть так:
$('form').on('submit', function(){
$('input, select').prop('disabled',false);
return true;
});
Ответ 6
Самый простой способ отправки отключенных полей - скопировать их в невидимый, не отключенный элемент управления перед отправкой. Некоторые люди создают эти элементы управления вручную и подключаются к событию on change в jQuery, чтобы скопировать их по требованию, но это решение является общим, простым и менее разговорным - хотя одно правило: вы должны создать (отобразить) чистую страницу после обратной передачи ( поэтому
$('#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);
});
});
Ответ 7
@readonly = true не работает на моей странице. Я сделал дополнительные исследования. Вот статья, которая объясняет это.
Атрибут ReadOnly не работает в ASP.NET MVC-моделях