Як подати відключений вхід у ASP.NET MVC?


108

Як подати відключений вхід у ASP.NET MVC?


3
Зазвичай вам потрібно сформулювати своє запитання як питання, а потім опублікувати відповідь окремо. Голосування про закриття; рекомендуємо перенести частину "відповідь" на фактичну відповідь.
Джордж Стокер

1
Я вважаю, що пост @Dhaval - це точно відповідь, оскільки у вашому запитанні слово відключено.
QMaster

Відповіді:


160

Ви не можете зробити поле readonly="readonly"замість disabled="disabled"? Значення поля лише для читання буде подано на сервер, але користувач ще не може редагувати його. SELECTТег є винятком , хоча.


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

22
4 роки робив .net asp, і я ніколи не знав, що відключені входи не повертаються назад ... як це мені пройшло? Просто включіть приховане поле для вибору з обмеженими можливостями та його всі сортовані. (Навіть якщо ідентифікатори повторюються у формі, яка заборонена)
Piotr Kula

5
Це також не працює для type="checkbox"входів
Натан,

1
Я намагаюся зробити те ж саме за допомогою радіо кнопок, але читання лише на них не працює.
Ранді Р

38

Дякуємо всім:

Як я вирішив це:

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

Примітка:

Я отримав цю інформацію у відповідь, але мене відредагували.


1
Це не дуже спрацювало для мене (я зрозумів це завдяки цьому посиланню SO ). Це спрацювало: textBox.Attributes.Add("readonly", "readonly");і пояснення - за посиланням
brian-d

Це добре, що ви його відредагували, оскільки це має для мене більше сенсу.
Явар

readonly, здається, шлях. Це не робить дивних речей, як, наприклад, не розміщення керування назад, але не дозволяє редагувати його. Дуже дякую!
Маріуш

Щоб додати до коментаря Майкла Брента, якщо ви використовуєте 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
Я використав це, не потрібно турбуватися про приховані елементи, не впевнений, чи є якісь недоліки, за винятком, можливо, невеликої затримки після публікації через функцію js
IronHide

2
Проти багатьох відповідей, які згадували про використання досить лише для читання, я вважаю, що у багатьох випадках нам потрібно відключити, я прочитав близько 15 відповідей у ​​подібних питаннях і вибрав це лише за допомогою власного фільтра jQuery для вибору відповідних елементів для видалення відключеного атрибута, чудово Дякую.
QMaster

Що робити, якщо ви подаєте заявку Ajax.BeginForm?
markzzz


1
виглядає трохи дивно, але це було єдине рішення, яке працювало на мене ...
AGuyCalledGerald

8

За дизайном браузери цього не підтримують.

Або зробіть їх, readonlyщо дозволяє надсилати значення на сервер, або якщо ви маєте справу з елементами управління, які все ще використовуються з readonlyтаким атрибутом, як "Вибір", додайте стиль 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.CheckBoxДля прихованого поля.

далі посилання, звідки я знайшов відповідь. http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033


1

розширення Tasos '(": вимкнено", $ (' # xxxForm ')). RemoveAttr ("вимкнено"); Ви можете використовувати:

$("#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, оскільки його відключення спричиняє втрату значення. Readonly також не працює на прапорець.

@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.