Html.DropdownListFor nilai yang dipilih tidak disetel

97

Bagaimana cara menyetel nilai yang dipilih dari sebuah Html.DropDownListFor? Saya telah melihat-lihat online dan telah melihat bahwa itu dapat dicapai dengan menggunakan parameter keempat seperti di bawah ini:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

Daftar pilih saya kemudian ditampilkan seperti ini:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

Tetapi untuk beberapa alasan Inggris tetap dipilih tetapi saya ingin "Pilih negara" untuk dipilih.

Adakah yang tahu bagaimana saya bisa mencapai ini?

EDIT

Saya telah memperbarui kode saya karena ada sedikit perubahan dalam fungsionalitas namun sepertinya masih mengalami masalah ini. Inilah yang menurut saya:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1adalah Id optionyang ingin saya pilih, saya juga mencoba dengan teks optiontetapi itu juga tidak berfungsi.

Ada ide?

Ibrar Hussain
sumber

Jawaban:

182

Kode Anda memiliki beberapa masalah konseptual:

Pertama ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Saat menggunakan DropDownListFor, parameter pertama adalah properti tempat nilai yang Anda pilih disimpan setelah Anda mengirimkan formulir. Jadi, dalam kasus Anda, Anda harus memiliki a SelectedOrderIdsebagai bagian dari model Anda atau sesuatu seperti itu, untuk menggunakannya dengan cara ini:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Kedua ,

Selain menggunakan ViewBag, itu tidak salah tetapi ada cara yang lebih baik (letakkan informasi itu di ViewModel sebagai gantinya), ada "bug kecil" (atau perilaku yang tidak diharapkan) ketika properti ViewBag Anda, tempat Anda memegang SelectList, adalah nama yang sama dari properti tempat Anda meletakkan nilai yang dipilih. Untuk menghindari hal ini, cukup gunakan nama lain saat menamai properti yang menyimpan daftar item.

Beberapa kode yang akan saya gunakan jika saya jadi Anda untuk menghindari masalah ini dan menulis kode MVC yang lebih baik:

Viewmodel:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

Pengontrol:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

Dalam Pandangan Anda:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
Romias
sumber
43
Menyelamatkan hari saya: "... ada sedikit bug ketika properti ViewBag Anda di mana Anda memegang SelectList adalah nama yang sama dari properti tempat Anda meletakkan nilai yang dipilih. Untuk menghindarinya, cukup gunakan nama lain saat menamai properti holding daftar item. " Terima kasih!
Michael A. Volz alias Flynn
4
"Kutu kecil" ini benar-benar gila! Hanya menyia-nyiakan 2 jam hidupku karena ini. Bagaimana bisa sesuatu yang begitu jelas masih ada dan tidak bisa ditambal?
cen
1
Flynn, komentar Anda seharusnya menjadi jawaban. Saya mencoba penerapan gila untuk membuat daftar turun bawah saya berfungsi dan ini adalah solusi sederhana
Dwayne Hinterlang
2
ada sedikit bug ? Ini bukan bug sama sekali. Model binding bekerja dengan cara mengikat nilai properti dan saat Anda mengikat OrderTemplatesupaya Anda untuk mengikat ke ViewBagproperti yang merupakan tipe IEnumerabe<SelectListItem>. Tetapi <select>elemen tidak dapat mengikat ke kumpulan objek kompleks (hanya tipe nilai)
Sialan, aku akan menyia-nyiakan sepanjang hari jika bukan karena jawaban ini. Serius bahwa LITTLE BUG adalah mengapa kita harus menebus viewbag
Layak7
22

Bagi saya tidak bekerja jadi begini:

Pengontrol:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

Melihat:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});
VINICIUS SIN
sumber
2
Pengontrol Anda memiliki jumlah tanda kurung yang salah: Pengontrol memiliki satu kurung buka dan dua kurung tutup.
Amos Long
7

Saat Anda melewati objek seperti ini:

new SelectList(Model, "Code", "Name", 0)

Anda mengatakan: Sumber ( Model) dan Kunci ( "Code") Teks ( "Name") dan nilai yang dipilih 0. Anda mungkin tidak memiliki 0nilai di source Anda untuk Codeproperti, jadi HTML Helper akan memilih elemen pertama untuk meneruskan selectedValue yang sebenarnya ke kontrol ini.

Felipe Oriani
sumber
3

Pastikan Anda telah memangkas nilai yang dipilih sebelum Anda menetapkan.

//Model

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

// Pengendali

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//Melihat

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })
Nalan Madheswaran
sumber
2

Jika Anda tahu apa yang akan ada dalam tampilan, Anda juga dapat menyetel nilai default dari Controller juga daripada mengaturnya ke dalam file view / cshtml. Tidak perlu menyetel nilai default dari sisi HTML.

Di file Controller.

commission.TypeofCommission = 1;
return View(commission);

Di file .cshtml.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
Smit Patel
sumber
1

Anda harus melupakan kelasnya

SelectList

Gunakan ini di Controller Anda :

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

Pilih nilainya:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

Tambahkan daftar ke ViewData:

ViewBag.CustomerTypes = customerTypes;

Gunakan ini di View Anda :

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

Informasi lebih lanjut di: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

g. membekukan
sumber
0

Tambahkan Bagian Kontroler

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Tambahkan Bagian Html

   @Html.DropDownList("Orders", null)

Metode sederhana

ibrahim ozboluk
sumber
Pemrosesan transaksi alternatif yang mudah
ibrahim ozboluk
0

Bagi saya solusi umum :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}
Hamit YILDIRIM
sumber
0

Linq ke Dropdown dengan item kosong, item yang dipilih (berfungsi 100%)
(Sangat Diketik, Kemungkinan kesalahan minimal) Setiap perubahan model akan tercermin dalam penjilidan

Kontroler

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

Melihat

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

Metode untuk mengikat data ini juga memungkinkan

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

sumber
var selList = CompTypeList.Select (s => SelectListItem baru {Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), Selected = s.CompTyp_Id == 3? true: false});
0

Saya tahu ini sebenarnya bukan jawaban untuk pertanyaan, tapi saya sedang mencari cara untuk menginisialisasi DropDownList dari daftar dengan cepat dalam tampilan ketika saya terus tersandung pada posting ini.

Kesalahan saya adalah saya mencoba membuat SelectList dari kamus seperti ini:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

Saya kemudian pergi menggali di doc msdn resmi , dan menemukan itu DropDownListFortidak selalu memerlukan SelectList, melainkan sebuah IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

Dalam kasus saya, saya mungkin juga dapat menghilangkan Model.Localityitem yang dipilih, karena ini a) satu-satunya item dan b) sudah mengatakannya di SelectListItem.Selectedproperti.

Jika Anda bertanya-tanya, sumber data adalah halaman AJAX, yang dimuat secara dinamis menggunakan kontrol SelectWoo / Select2.

Damian Vogel
sumber
0
public byte UserType
public string SelectUserType

Anda perlu mendapatkan satu dan mengatur yang berbeda. Nilai yang dipilih tidak boleh sama dengan item yang akan Anda setel.

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

Saya menggunakan kamus Enum untuk daftar saya, itulah mengapa ada pasangan "kunci", "nilai".

MEO
sumber
0

Saya memiliki masalah serupa, saya menggunakan ViewBag dan nama Elemen sama. (Kesalahan pengetikan)

Arun Prasad ES
sumber
0

Ini adalah masalah CSS. Saya tidak tahu mengapa @ Html.DropDownListFor di Bootstrap 4 bisa berfungsi. Tentunya ini masalah desain kelas. Bagaimanapun pekerjaannya adalah, jika kotak input Dropdown Anda memiliki Padding CSS: #px, # px; elemen lalu nonaktifkan. Semoga ini berhasil.

naz hassan
sumber