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

DLeh
источник
20

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

tvanfosson
источник
Да, я думал о том, что вы предлагаете. Но мне бы пришлось обрабатывать больше переменных. Я надеюсь, что мой пост появится в Google, и людям не придется мучиться в поисках простого решения.
Санчитос,
4
Одна из проблем с вашим решением заключается в том, что оно ломается, если отключен javascript. Внедрение скрытого поля на стороне сервера не имеет этой проблемы.
tvanfosson
15

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

$(":disabled", $('#frmMain')).removeAttr("disabled");
Дхавал Панхания
источник
2
Я использовал это, не нужно беспокоиться о скрытых элементах, не уверен, есть ли какие-либо недостатки, кроме, возможно, небольшой задержки при обратной
отправке
2
В отличие от многих ответов, в которых упоминалось об использовании отключенного атрибута только для чтения, я считаю, что во многих случаях нам нужно использовать disabled, я прочитал около 15 ответов на похожие вопросы и выбрал это только с собственным фильтром jQuery, чтобы выбрать соответствующие элементы для удаления атрибута disabled, отлично Спасибо.
QMaster
Что делать, если вы отправляете с Ajax.BeginForm?
markzzz
используйте OnBegin « msdn.microsoft.com/en-us/library/… »
Дхавал Панхания
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 })
Joetinger
источник
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
});
аромат
источник
1

Это поможет в отправке значений модели в ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
Рохан
источник
1
Пожалуйста, отформатируйте свой ответ . это делает его более читаемым для всех
Тарик Веллинг,
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, связанном с этим представлением.

Куроге
источник