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?

Sanchitos
źródło
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ż.

Darin Dimitrov
źródło
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.

Sanchitos
źródło
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.

DLeh
źródło
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.

tvanfosson
źródło
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");
Dhaval Pankhaniya
źródło
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
użyj OnBegin „ msdn.microsoft.com/en-us/library/…
Dhaval Pankhaniya
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>
Dave
źródło
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 })
joetinger
źródło
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
});
Flavior
źródło
1

Pomoże to w przesłaniu wartości modeli w ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
Rohan
źródło
1
Proszę sformatować swoją odpowiedź . dzięki temu jest bardziej czytelny dla wszystkich
Tarick Welling
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)
Mehmet Taha Meral
źródło
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>

Ahmed Mahmoud AbdElbaset
źródło
-3

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

Kuroge
źródło