Bagaimana cara mengirimkan input yang dinonaktifkan di ASP.NET MVC?

108

Bagaimana cara mengirimkan input yang dinonaktifkan di ASP.NET MVC?

Sanchitos
sumber
3
Umumnya Anda perlu menyusun pertanyaan Anda sebagai pertanyaan dan kemudian memposting jawabannya secara terpisah. Voting untuk menutup; merekomendasikan Anda untuk memindahkan bagian 'jawaban' ke jawaban yang sebenarnya.
George Stocker
1
Saya percaya posting @Dhaval adalah jawaban yang tepat karena kata yang dinonaktifkan dalam pertanyaan Anda.
QMaster

Jawaban:

160

Tidak bisakah Anda membuat lapangan, readonly="readonly"bukan disabled="disabled"? Nilai bidang hanya-baca akan dikirimkan ke server sementara masih tidak dapat diedit oleh pengguna. Sebuah SELECTtag adalah pengecualian.

Darin Dimitrov
sumber
1
readonly berfungsi tetapi tidak berwarna abu-abu. Berikut adalah contoh yang saya gunakan: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>bagaimana saya bisa membuatnya menjadi abu-abu sehingga secara visual sepertinya tidak dapat diedit. Lebih baik lagi kita dapat menggunakan sesuatu yang mirip dengan LabelFor, saya mencoba LabelFor tetapi hanya mendapatkan DisplayName ....
VoodooChild
22
4 tahun melakukan .net asp dan saya tidak pernah tahu bahwa input yang dinonaktifkan tidak mendapatkan poste kembali ... bagaimana saya bisa lolos? Cukup sertakan bidang Tersembunyi untuk pilih yang dinonaktifkan dan semuanya diurutkan. (Meskipun ID diulang pada formulir yang tidak diperbolehkan)
Piotr Kula
5
Ini juga tidak berfungsi untuk type="checkbox"input
Nathan
1
Saya mencoba melakukan hal yang sama dengan tombol radio, tetapi hanya baca sepertinya tidak berfungsi.
Randy R
38

Terima kasih untuk semuanya:

Cara saya menyelesaikan ini:

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

catatan:

Saya mendapat informasi ini di jawabannya tetapi saya telah diedit.

Sanchitos
sumber
1
Ini tidak cukup berhasil untuk saya (mengetahuinya berkat tautan SO ini ). Ini berhasil: textBox.Attributes.Add("readonly", "readonly");dan penjelasannya ada di tautan
brian-d
Itu bagus karena Anda mengeditnya karena ini lebih masuk akal bagi saya.
Yawar
tampaknya hanya membaca cara untuk pergi. Itu tidak melakukan hal-hal aneh seperti tidak mengembalikan kendali tetapi tidak memungkinkan untuk mengeditnya. Terima kasih banyak!
Mariusz
Untuk menambah komentar Michael Brennt, jika Anda menggunakan jQuery baris kedua menjadi $("#textBoxId").css("color", "#c0c0c0").
F1Krazy
30

@ppumkin menyebutkan ini pada komentarnya tentang jawaban ini, tetapi saya ingin menyorotinya karena saya tidak dapat menemukan sumber daya lain untuk mengirimkan data dari penyandang cacat <select>. Saya juga percaya ini relevan dengan pertanyaan karena yang dipilih bukan <input>s tetapi mereka adalah "masukan".

Cukup sertakan bidang Tersembunyi untuk pilih yang dinonaktifkan dan semuanya diurutkan.

Contoh:

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

Perhatian: ini akan menempatkan dua tag pada halaman dengan ID yang sama, yang sebenarnya bukan HTML yang valid dan dapat menyebabkan pusing dengan javascript. Bagi saya, saya memiliki javascript untuk mengatur nilai dropdown dengan html-nya id, dan jika Anda meletakkan bidang tersembunyi terlebih dahulu, javascript akan menemukannya, bukan select.

DLeh
sumber
20

Biasanya, jika saya memiliki bidang yang "hanya-baca" tetapi perlu dikirim kembali ke server, saya akan membuat tampilan dinonaktifkan (atau hanya teks), tetapi kemudian menambahkan bidang tersembunyi dengan nama yang sama. Anda masih perlu memastikan bahwa bidang tersebut tidak benar-benar diubah di sisi server - jangan perbarui dari model dalam tindakan Anda - tetapi status model akan tetap akurat jika ada kesalahan.

tvanfosson.dll
sumber
Ya, saya sedang berpikir untuk melakukan apa yang Anda sugesting. Tapi saya harus menangani lebih banyak variabel. Saya melompat bahwa mungkin postingan saya akan muncul di google dan orang-orang tidak perlu menderita, mencari solusi yang mudah.
Sanchitos
4
Satu masalah dengan solusi Anda adalah ia rusak jika javascript dinonaktifkan. Memasukkan sisi server bidang tersembunyi tidak memiliki masalah ini.
tvanfosson
15

Anda juga dapat menggunakan kode seperti ini sebelum formulir dikirimkan:

$(":disabled", $('#frmMain')).removeAttr("disabled");
Dhaval Pankhaniya
sumber
2
Saya menggunakan ini, tidak perlu khawatir tentang elemen tersembunyi, tidak yakin apakah ada kerugian, kecuali mungkin sedikit penundaan pada posting kembali karena fungsi js
IronHide
2
Terhadap banyak jawaban yang menyebutkan tentang menggunakan hanya-baca agak dinonaktifkan, saya percaya dalam banyak kasus kita perlu menggunakan dinonaktifkan, saya membaca sekitar 15 jawaban dalam pertanyaan serupa dan memilih ini hanya dengan filter jQuery sendiri untuk memilih elemen yang sesuai untuk menghapus atribut yang dinonaktifkan, hebat Terima kasih.
QMaster
Bagaimana jika Anda mengirimkan dengan Ajax.BeginForm?
markzzz
gunakan OnBegin " msdn.microsoft.com/en-us/library/… "
Dhaval Pankhaniya
1
terlihat agak aneh, tetapi itu adalah satu-satunya solusi yang berhasil untuk saya ...
AGuyCalledGerald
8

Dengan desain browser tidak mendukung itu.

Baik membuatnya readonlyyang memungkinkan pengiriman nilai ke server atau jika Anda berurusan dengan kontrol yang masih dapat digunakan dengan readonlyatribut seperti Pilih, tambahkan gaya csspointer-events: none; untuk menjadikannya non-interaktif

Agak hack, tapi berhasil! Ini juga berfungsi ketika Anda mengirimkan formulir secara langsung dengan tombol kirim tanpa menggunakan javascript. Tidak perlu kerja ekstra!

Misalnya:

<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
sumber
6

Anda dapat membuat template editor seperti di bawah ini

CSS

.disabled {
    background-color:lightgray;
}

Template Editor

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

memperluas Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); kamu bisa memakai:

$("#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
});
rasa
sumber
1

Ini akan membantu dalam mengirimkan nilai model di ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
Rohan
sumber
1
Harap format jawaban Anda . ini membuatnya lebih mudah dibaca oleh semua orang
Tarick Welling
0

Saya biasanya menggunakan cara ini untuk CheckBox atau CheckBoxFor karena membuatnya dinonaktifkan menyebabkan hilangnya nilai. Hanya baca tidak berfungsi di kotak centang juga.

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)
Mehmet Taha Meral
sumber
0

Letakkan saja skrip ini dalam skrip @ bagian di halaman Anda. ini akan mengaktifkan masukan saat Anda mengirimkan halaman, dan Anda harus mengarahkan pengguna ke halaman lain setelah mengirimkan.

<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
sumber
-3

Buat saja properti itu [Wajib] di ViewModel ditautkan ke tampilan itu.

Kuroge
sumber