Jak przesłać wyłączone dane wejściowe w ASP.NET MVC?


108

Jak przesłać wyłączone dane wejściowe w ASP.NET MVC?


3
Zwykle musisz sformułować swoje pytanie jako pytanie, a następnie opublikować odpowiedź oddzielnie. Głosowanie za zamknięciem; zalecam przeniesienie części „odpowiedź” do rzeczywistej odpowiedzi.
— George Stocker

1
Uważam, że post @Dhaval jest dokładnie odpowiedzią z powodu wyłączonego słowa w Twoim pytaniu.
— QMaster

Odpowiedzi:


160

Nie możesz zrobić pola readonly="readonly"zamiast disabled="disabled"? Wartość pola tylko do odczytu zostanie przesłana na serwer, podczas gdy użytkownik nadal nie będzie mógł jej edytować. SELECTZnacznik jest wyjątek chociaż.


1
readonly działa, ale nie powoduje wyszarzenia pola. Oto przykład, którego używam: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>jak mogę to wyszarzać, aby wyglądało na to, że nie można go edytować. Jeszcze lepiej, czy możemy użyć czegoś podobnego do LabelFor, próbowałem LabelFor, ale dostaje tylko DisplayName ....
— VoodooChild

22
4 lata robię .net asp i nigdy nie wiedziałem, że wyłączone wejścia nie dostaną poste z powrotem ... jak to przeszło? Wystarczy dołączyć Ukryte pole dla wyłączonej selekcji i wszystko posortować. (Mimo że identyfikatory są powtarzane na formularzu, co jest niedozwolone)
— Piotr Kula

5
To również nie działa w przypadku type="checkbox"danych wejściowych
— Nathan

1
Próbuję zrobić to samo z przyciskami radiowymi, ale readonly nie wydaje się działać na nich.
— Randy R

38

Dziękuję wszystkim:

Sposób, w jaki rozwiązałem ten problem:

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

Uwaga:

Mam te informacje na temat odpowiedzi, ale zostały poprawione.


1
To nie zadziałało dla mnie (zorientowałem się dzięki temu linkowi SO ). To zadziałało: textBox.Attributes.Add("readonly", "readonly");a wyjaśnienie jest w linku
— brian-d

Dobrze, że go zredagowałeś, bo to ma dla mnie więcej sensu.
— Yawar

readonly wydaje się być do zrobienia. Nie robi dziwnych rzeczy, takich jak nie odkładanie kontrolki z powrotem, ale nie pozwala jej edytować. Bardzo dziękuję!
— Mariusz

Aby dodać do komentarza Michaela Brennta, jeśli używasz jQuery, druga linia staje się $("#textBoxId").css("color", "#c0c0c0").
— F1Krazy

30

@ppumkin wspomniał o tym w swoim komentarzu do tej odpowiedzi, ale chciałem to podkreślić, ponieważ nie mogłem znaleźć innych zasobów dotyczących przesyłania danych od osoby niepełnosprawnej <select>. Uważam również, że jest to istotne dla pytania, ponieważ wybrane elementy nie są <input>s, ale są „ danymi wejściowymi”.

Po prostu dołącz Ukryte pole dla wyłączonego wyboru i wszystko posortowane.

Przykład:

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

Uwaga: spowoduje to umieszczenie na stronie dwóch tagów o tym samym identyfikatorze, który nie jest w rzeczywistości poprawnym kodem HTML i może powodować ból głowy przy korzystaniu z JavaScript. Dla mnie mam javascript, aby ustawić wartość listy rozwijanej według jego html id, a jeśli umieścisz ukryte pole jako pierwsze, javascript znajdzie to zamiast select.


20

Zwykle, jeśli mam pole, które jest „tylko do odczytu”, ale musi zostać przesłane z powrotem na serwer, wyłączam wyświetlanie (lub po prostu tekst), a następnie dodam ukryte pole o tej samej nazwie. Nadal musisz upewnić się, że pole nie jest faktycznie modyfikowane po stronie serwera - po prostu nie aktualizuj go z modelu w akcji - ale stan modelu będzie nadal dokładny, jeśli wystąpią błędy.


Tak, myślałem o zrobieniu tego, co sugerujesz. Ale musiałbym obsłużyć więcej zmiennych. Mam nadzieję, że być może mój post pojawi się w google i ludzie nie będą musieli cierpieć, szukając łatwego rozwiązania.
— Sanchitos,

4
Jednym z problemów z rozwiązaniem jest to, że psuje się, jeśli JavaScript jest wyłączony. Wstrzyknięcie pola ukrytego po stronie serwera nie powoduje tego problemu.
— tvanfosson

15

Możesz również użyć takiego kodu przed przesłaniem formularza:

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

2
Użyłem tego, nie muszę się martwić o ukryte elementy, nie jestem pewien, czy są jakieś wady, z wyjątkiem może niewielkiego opóźnienia w wysyłaniu wiadomości z powodu funkcji js
— IronHide

2
Wbrew wielu odpowiedziom, które wspomniały o używaniu tylko do odczytu, a raczej wyłączonych, uważam, że w wielu przypadkach musimy używać wyłączonych, przeczytałem około 15 odpowiedzi w podobnych pytaniach i wybrałem to tylko z własnym filtrem jQuery, aby wybrać odpowiednie elementy do usunięcia wyłączonego atrybutu, świetnie dzięki.
— QMaster

A co jeśli składasz Ajax.BeginForm?
— markzzz


1
wygląda trochę dziwnie, ale to było jedyne rozwiązanie, które zadziałało ...
— AGuyCalledGerald

8

Z założenia przeglądarki tego nie obsługują.

Albo utwórz je, readonlyco pozwoli na przesyłanie wartości do serwera lub jeśli masz do czynienia z kontrolkami, które są nadal użyteczne z readonlyatrybutem, takim jak Wybierz, dodaj styl csspointer-events: none; aby były nieinteraktywne

Coś w rodzaju włamania, ale działa! Działa również, gdy przesyłasz formularz bezpośrednio za pomocą przycisku przesyłania bez użycia JavaScript. Żadna dodatkowa praca nie jest wymagana!

Na przykład:

<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

Możesz utworzyć szablon edytora, taki jak ten poniżej

CSS

.disabled {
    background-color:lightgray;
}

Szablon edytora

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


1

rozwijanie Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); możesz użyć:

$("#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

Zwykle używam tego sposobu dla CheckBox lub CheckBoxFor, ponieważ wyłączenie go powoduje utratę wartości. Tylko do odczytu nie działa również na polu wyboru.

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

0

Po prostu umieść ten skrypt w skryptach @section na swojej stronie. umożliwi to wprowadzanie danych podczas przesyłania strony, a po przesłaniu należy przekierować użytkownika na inną stronę.

<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

Po prostu ustaw tę właściwość [Wymagane] w ViewModel połączonym z tym widokiem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.