Как отправить отключенный ввод в 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.