Как отправить отключенный ввод в ASP.NET MVC?


108

Как отправить отключенный ввод в ASP.NET MVC?


3
Как правило, вам нужно сформулировать свой вопрос как вопрос, а затем опубликовать ответ отдельно. Голосование по закрытию; рекомендую переместить часть «ответ» на фактический ответ.
— Джордж Стокер

1
Я считаю, что сообщение @Dhaval - это точный ответ из-за отключенного слова в вашем вопросе.
— QMaster

Ответы:


160

Разве вы не можете сделать поле readonly="readonly"вместо disabled="disabled"? Значение поля только для чтения будет отправлено на сервер, но пользователь не сможет его редактировать. Однако SELECTтег - исключение.


1
только чтение работает, но не выделяет поле серым цветом. Вот пример, который я использую: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>как сделать его серым, чтобы он выглядел так, будто он не редактируется. А еще лучше мы можем использовать что-то похожее на LabelFor, я попробовал LabelFor, но он получает только DisplayName ....
— VoodooChild

22
4 года занимаюсь .net asp, и я никогда не знал, что отключенные входы не возвращаются обратно ... как это меня прошло? Просто включите скрытое поле для отключенного выбора и все его отсортированы (даже если идентификаторы повторяются в форме, что недопустимо)
— Петр Кула

5
Это не работает и для type="checkbox"входных данных,
— Натан,

1
Я пытаюсь сделать то же самое с переключателями, но, похоже, только чтение с ними не работает.
— Randy R

38

Спасибо всем:

Как я решил это:

document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";

Примечание:

Я получил эту информацию по ответу, но меня отредактировали.


1
Это не совсем сработало для меня (понял это благодаря этой ссылке SO ). Это сработало: textBox.Attributes.Add("readonly", "readonly");и объяснение в ссылке
— brian-d

Хорошо, что вы его отредактировали, потому что это имеет для меня больше смысла.
— Yawar

readonly кажется подходящим вариантом. Он не делает странных вещей, например, не возвращает элемент управления обратно, но не позволяет его редактировать. Большое спасибо!
— Mariusz

Чтобы добавить к комментарию Майкла Бреннта, если вы используете jQuery, вторая строка станет $("#textBoxId").css("color", "#c0c0c0").
— F1Krazy

30

@ppumkin упомянул об этом в своем комментарии к этому ответу, но я хотел выделить это, поскольку мне не удалось найти другие ресурсы по отправке данных от инвалида <select>. Я также считаю, что это имеет отношение к вопросу, поскольку выборки не являются, <input>а являются «входными».

Просто включите скрытое поле для отключенного выбора и все отсортировано.

Пример:

@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@

Внимание: это поместит на страницу два тега с одинаковым идентификатором, который на самом деле не является правильным HTML и может вызвать головную боль с javascript. Для меня у меня есть javascript, чтобы установить значение раскрывающегося списка по его html id, и если вы сначала поместите скрытое поле, javascript найдет это вместо select.


20

Обычно, если у меня есть поле «только для чтения», но его нужно отправить обратно на сервер, я отключу отображение (или просто текст), но затем добавлю скрытое поле с тем же именем. Вам все равно нужно убедиться, что поле фактически не изменено на стороне сервера - просто не обновляйте его из модели в своем действии - но состояние модели все равно будет точным, если есть ошибки.


Да, я думал о том, что вы предлагаете. Но мне бы пришлось обрабатывать больше переменных. Я надеюсь, что мой пост появится в Google, и людям не придется мучиться в поисках простого решения.
— Санчитос,

4
Одна из проблем с вашим решением заключается в том, что оно ломается, если отключен javascript. Внедрение скрытого поля на стороне сервера не имеет этой проблемы.
— tvanfosson

15

Вы также можете использовать такой код перед отправкой формы:

$(":disabled", $('#frmMain')).removeAttr("disabled");

2
Я использовал это, не нужно беспокоиться о скрытых элементах, не уверен, есть ли какие-либо недостатки, кроме, возможно, небольшой задержки при обратной
— отправке

2
В отличие от многих ответов, в которых упоминалось об использовании отключенного атрибута только для чтения, я считаю, что во многих случаях нам нужно использовать disabled, я прочитал около 15 ответов на похожие вопросы и выбрал это только с собственным фильтром jQuery, чтобы выбрать соответствующие элементы для удаления атрибута disabled, отлично Спасибо.
— QMaster

Что делать, если вы отправляете с Ajax.BeginForm?
— markzzz


1
выглядит немного странно, но это было единственное решение, которое сработало для меня ...
— AGuyCalledGerald

8

Браузеры по дизайну не поддерживают это.

Либо сделайте их, readonlyкоторые позволяют отправлять значения на сервер, либо, если вы имеете дело с элементами управления, которые все еще можно использовать с readonlyатрибутом, таким как Select, добавьте стиль css, pointer-events: none;чтобы сделать их не интерактивными

Вроде хак, но работает! Это также работает, когда вы отправляете форму напрямую с помощью кнопки отправки без использования javascript. Никакой дополнительной работы не требуется!

Например:

<select asp-for="TypeId" 
   asp-items="@(new SelectList(await TypeRepository.FetchTypesAsync(), "TypeId", "Name"))"
   class="form-control form-control-sm" 
   readonly 
   style="pointer-events: none;">
</select>

6

Вы можете создать шаблон редактора, подобный приведенному ниже

CSS

.disabled {
    background-color:lightgray;
}

Шаблон редактора

@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })

2

когда мы имеем дело с отключенными, но отмеченными флажками и хотим опубликовать значение, нам нужно убедиться, что наше скрытое поле отображается перед скрытым полем @ Html.CheckBoxFor.

Ниже приводится ссылка, по которой я нашел ответ. http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033


1

расширение Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); ты можешь использовать:

$("#xxxForm").submit(function (e) {
    e.preventDefault();
    var form = this;
    $('#Field1')[0].disabled = false;
    $('#Field2')[0].disabled = false;
    ...
    $('#FieldN')[0].disabled = false;
    form.submit(); // submit bypassing the jQuery bound event
});


0

Я обычно использую этот способ для CheckBox или CheckBoxFor, потому что отключение его приводит к потере значения. Только чтение не работает с флажком.

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)

0

Просто поместите этот скрипт в скрипты @section на своей странице. это позволит вводить данные при отправке страницы, и вы должны перенаправить пользователя на другую страницу после отправки.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js">
$("form").submit(function () {
                    if ($('form').valid()) {
                        $("input").removeAttr("disabled");
                    }
                });
</script>


-3

Просто сделайте это свойство [Обязательным] в ViewModel, связанном с этим представлением.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.