Связывание модели с отключенным текстовым полем - PullRequest
40 голосов
/ 16 апреля 2010

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

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

Ответы [ 7 ]

59 голосов
/ 16 апреля 2010

Я считаю, что поле формы, которое отключено, ничего не передает. Если у вас есть форма и вы отключили поле foo в этой форме, то при публикации сообщение не будет иметь значение для поля foo. Это просто природа отключения поля в HTML, и это не проблема MVC.

51 голосов
/ 23 марта 2012

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>
5 голосов
/ 16 апреля 2010

Если вы хотите, чтобы значение было отправлено обратно, но не было редактируемым, рассмотрите возможность помещения его в скрытое поле. Очевидно, не делайте этого ни для чего, требующего определенной степени безопасности, так как пользователь может вмешаться в это.

4 голосов
/ 15 июня 2017

Как предлагается в комментариях, опция readonly вместо disabled может быть опцией, но она не будет работать для полей выбора. Вместо того, чтобы создавать скрытый ввод, вы можете оставить входы или выбрать как отключенные и по-прежнему передавать данные, изменяя отключенное свойство с JavaScript при отправке.

Используя jQuery, это выглядело бы так:

$('form').on('submit', function(){
    $('input, select').prop('disabled',false);
    return true;
});
4 голосов
/ 18 июня 2013

Вы можете обойти эту проблему, добавив скрытое поле с тем же значением;)

<%= Html.Hidden("Username", Model.Form.Username)%>
1 голос
/ 18 мая 2016

Самый простой способ отправить отключенные поля - скопировать их в невидимый, не отключенный элемент управления перед отправкой. Некоторые люди создают эти элементы управления вручную и подключаются к событию 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);
    });

});
0 голосов
/ 10 февраля 2017

@ readonly = true не работает на моей странице. Я провел дополнительное исследование. Вот статья, которая объясняет это

Атрибут ReadOnly не работает в моделях ASP.NET MVC

...