Saya telah mencoba ini adalah RC1 dan kemudian meningkatkan ke RC2 yang tidak menyelesaikan masalah.
// in my controller
ViewData["UserId"] = new SelectList(
users,
"UserId",
"DisplayName",
selectedUserId.Value); // this has a value
hasil: properti SelectedValue disetel pada objek
// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%>
hasil: semua opsi yang diharapkan diberikan ke klien, tetapi atribut yang dipilih tidak disetel. Item di SelectedValue ada di dalam daftar, tetapi item pertama dalam daftar selalu default untuk dipilih.
Bagaimana saya harus melakukan ini?
Pembaruan Berkat jawaban John Feminella, saya mengetahui apa masalahnya. "UserId" adalah properti dalam Model my View sangat diketik. Saat Html.DropDownList ("UserId" diubah ke nama lain selain "UserId", nilai yang dipilih akan ditampilkan dengan benar.
Ini menghasilkan nilai yang tidak terikat ke model.
asp.net-mvc
blu
sumber
sumber
Jawaban:
Beginilah cara saya memperbaiki masalah ini:
Saya memiliki yang berikut ini:
Pengontrol:
Melihat
Diubah oleh yang berikut:
Melihat
Tampaknya DropDown tidak boleh memiliki nama yang sama memiliki nama ViewData: S aneh tetapi berhasil.
sumber
Coba ini:
Lalu:
Dengan MVC RC2, saya mendapatkan:
sumber
Anda masih dapat menamai DropDown sebagai "UserId" dan masih memiliki pengikatan model yang berfungsi dengan benar untuk Anda.
Satu-satunya persyaratan agar ini berfungsi adalah bahwa kunci ViewData yang berisi SelectList tidak memiliki nama yang sama dengan properti Model yang ingin Anda ikat. Dalam kasus khusus Anda, ini adalah:
Ini akan menghasilkan elemen pilih bernama UserId, yang memiliki nama yang sama dengan properti UserId dalam model Anda dan oleh karena itu pengikat model akan menyetelnya dengan nilai yang dipilih dalam elemen pilih html yang dihasilkan oleh helper Html.DropDownList.
Saya tidak yakin mengapa konstruktor Html.DropDownList tertentu tidak akan memilih nilai yang ditentukan dalam SelectList saat Anda meletakkan daftar pilih di ViewData dengan kunci yang sama dengan nama properti. Saya menduga ini ada hubungannya dengan bagaimana helper DropDownList digunakan dalam skenario lain, di mana konvensi adalah bahwa Anda memiliki SelectList di ViewData dengan nama yang sama dengan properti dalam model Anda. Ini akan bekerja dengan benar:
sumber
Jika menurut kami ini bukan bug yang harus diperbaiki tim, sebaiknya MSDN memperbaiki dokumen tersebut. Yang membingungkan sebenarnya berasal dari dokumen buruk ini. Di MSDN , ini menjelaskan nama parameter sebagai,
Ini hanya berarti html terakhir yang dihasilkannya akan menggunakan parameter itu sebagai nama input pemilihan. Tapi, sebenarnya artinya lebih dari itu.
Saya kira perancang berasumsi bahwa pengguna akan menggunakan model tampilan untuk menampilkan daftar tarik-turun, juga akan menggunakan pos kembali ke model tampilan yang sama . Tetapi dalam banyak kasus, kami tidak benar-benar mengikuti asumsi itu.
Gunakan contoh di atas,
Jika kita mengikuti asumsinya, kita harus mendefinisikan model tampilan untuk tampilan terkait dropdownlist ini
Karena ketika memposting kembali, hanya nilai yang dipilih yang akan memposting kembali, jadi nilai yang dipilih harus diposting kembali ke properti model SelectedPersonId, yang berarti nama parameter pertama Html.DropDownList harus 'SelectedPersonId'. Jadi, desainer berpikir bahwa saat menampilkan tampilan model dalam tampilan, properti model SelectedPersonId harus menyimpan nilai default dari daftar dropdown tersebut. Meskipun List <SelectListItem> Persons Anda telah menyetel flag yang Dipilih untuk menunjukkan mana yang dipilih / default, tml.DropDownList akan benar-benar mengabaikannya dan membangun ulang IEnumerable <SelectListItem> itu sendiri dan menyetel item default / yang dipilih berdasarkan namanya.
Berikut adalah kode dari asp.net mvc
Jadi, kode sebenarnya melangkah lebih jauh, tidak hanya mencoba mencari nama di model, tetapi juga di viewdata, segera setelah menemukannya, ia akan membangun kembali selectList dan mengabaikan Selected asli Anda.
Masalahnya adalah, dalam banyak kasus, kami tidak benar-benar menggunakannya. kami hanya ingin memasukkan selectList dengan satu / beberapa item Selected set true.
Tentu saja solusinya sederhana, gunakan nama yang tidak ada di model atau di viewdata. Jika tidak dapat menemukan kecocokan, itu akan menggunakan selectList asli dan Selected asli akan berpengaruh.
Tapi saya masih berpikir MVC harus memperbaikinya dengan menambahkan satu syarat lagi
Karena, jika selectList asli sudah memiliki satu Selected, mengapa Anda mengabaikannya?
Hanya pikiranku.
sumber
Kode di posting MVC 3 sebelumnya tidak berfungsi tetapi ini adalah awal yang baik. Saya akan memperbaikinya. Saya telah menguji kode ini dan bekerja di MVC 3 Razor C # Kode ini menggunakan pola ViewModel untuk mengisi properti yang mengembalikan a
List<SelectListItem>
.Kelas Model
Kelas ViewModel
Metode Pengontrol
Pandangan
Output HTML akan menjadi seperti
tergantung bagaimana Anda memformat keluaran. Saya harap ini membantu. Kode itu berfungsi.
sumber
selected
opsi.Ini tampaknya merupakan bug di kelas SelectExtensions karena hanya akan memeriksa ViewData daripada model untuk item yang dipilih. Jadi triknya adalah menyalin item yang dipilih dari model ke dalam koleksi ViewData di bawah nama properti.
Ini diambil dari jawaban yang saya berikan di forum MVC, saya juga punya jawaban yang lebih lengkap di postingan blog yang menggunakan atribut DropDownList Kazi ...
Diberikan model
dan model tampilan dasar
Kemudian kami menulis template editor DropDownList sebagai berikut ..
Ini juga akan berfungsi jika Anda mengubah ArticleType dalam model tampilan ke SelectListItem, meskipun Anda harus menerapkan pengonversi tipe sesuai blog Kazi dan mendaftarkannya untuk memaksa pengikat memperlakukan ini sebagai tipe sederhana.
Di pengontrol Anda, kami kemudian memiliki ...
sumber
Masalahnya adalah bahwa dropbox tidak berfungsi sama dengan listbox, setidaknya seperti yang diharapkan oleh desain ASP.NET MVC2: Dropbox hanya mengizinkan nol atau satu nilai, karena listbox dapat memiliki pilihan beberapa nilai. Jadi, karena ketat dengan HTML, nilai itu tidak boleh ada dalam daftar opsi sebagai tanda "dipilih", tetapi di masukan itu sendiri.
Lihat contoh berikut:
Combo memiliki opsi yang dipilih, tetapi juga memiliki kumpulan atribut nilainya . Jadi, jika Anda ingin ASP.NET MVC2 merender dropbox dan juga memilih nilai tertentu (misalnya, nilai default, dll.), Anda harus memberinya nilai dalam rendering, seperti ini:
sumber
Di ASP.NET MVC 3 Anda cukup menambahkan daftar Anda ke ViewData ...
... dan kemudian rujuk dengan nama di tampilan pisau cukur Anda ...
Anda tidak perlu "menggunakan" daftar secara manual di panggilan DropDownList. Melakukannya dengan cara ini dengan benar mengatur nilai yang dipilih untuk saya juga.
Penolakan:
sumber
Saya berhasil mendapatkan hasil yang diinginkan, tetapi dengan pendekatan yang sedikit berbeda. Dalam Dropdownlist saya menggunakan Model dan kemudian mereferensikannya. Tidak yakin apakah ini yang Anda cari.
Model.Matters.FeeStructures di atas adalah my id, yang bisa menjadi nilai Anda dari item yang harus dipilih.
sumber