Як подати відключений вхід у 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.