Подтвердить что ты не робот

Связывание модели с отключенным текстовым полем

У меня есть текстовое поле, которое я определяю как

<%= 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, но предпочел бы использовать отключенный, так что визуально очевидно, что пользователь не может редактировать значение поля.

4b9b3361

Ответ 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);
    });

});