Html.DropdownListFor seçilen değer ayarlanmıyor


99

Bir Html.DropDownListFor için seçilen değeri nasıl ayarlayabilirim? İnternette bir göz atıyorum ve aşağıdaki gibi dördüncü parametre kullanılarak elde edilebileceğini gördüm:

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

Seçim listem daha sonra şu şekilde görüntüleniyor:

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

Ancak bazı nedenlerden dolayı Birleşik Krallık seçili kalıyor, ancak "Lütfen bir ülke seçin" seçeneğinin seçilmesini istiyorum.

Bunu nasıl başarabileceğimi bilen var mı?

DÜZENLE

İşlevsellikte küçük bir değişiklik olduğu için kodumu güncelledim, ancak yine de bu sorunla karşılaşıyor gibi görünüyor. Benim görüşüme göre bu:

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

1optionseçilmesini istediğim kimliği , metniyle de denedim optionama bu da çalışmıyor.

Herhangi bir fikir?

Yanıtlar:


183

Kodunuzun bazı kavramsal sorunları var:

İlk olarak ,

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

DropDownListFor kullanılırken, ilk parametre, formu gönderdikten sonra seçtiğiniz değerin depolandığı özelliktir. Öyleyse, sizin durumunuzda, SelectedOrderIdbu şekilde kullanmak için modelinizin bir parçası veya buna benzer bir şeye sahip olmalısınız :

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

İkincisi ,

ViewBag'i kullanmanın yanı sıra, bu yanlış değildir ancak daha iyi yollar vardır (bu bilgiyi bunun yerine ViewModel'e koyun), SelectList'i tuttuğunuz ViewBag mülkünüzde "küçük bir hata" (veya beklenmeyen bir davranış) vardır. seçilen değeri koyduğunuz mülkün aynı adı . Bundan kaçınmak için, öğe listesini tutan özelliği adlandırırken başka bir ad kullanın.

Yerinde olsam bu sorunları önlemek ve daha iyi MVC kodu yazmak için kullanacağım bazı kodlar:

Görünüm modeli:

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

   // Other properties you need in your view
}

Denetleyici:

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

   return View(model);
}

Sizin Görüşünüzde:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")

44
Günümü kurtardı: "... SelectList'i tuttuğunuz ViewBag mülkünüzün, seçilen değeri koyduğunuz mülkün adıyla aynı olması durumunda küçük bir hata oluşuyor. Bundan kaçınmak için, mülk sahibi olan mülkü adlandırırken başka bir ad kullanın öğelerin listesi. " Teşekkür ederim!
Michael A. Volz aka Flynn

4
Bu "küçük böcek" tam bir delilik! Bunun yüzünden hayatımın 2 saatini boşa harcadım. Nasıl bu kadar bariz bir şey hala var olur ve yamalanmaz?
cen

1
Flynn, yorumun aslında bir cevap olmalı. Açılır listemi çalıştırmak için çılgın uygulamaları denedim ve bu basit çözümdü
Dwayne Hinterlang

2
küçük bir hata mı var? Hiç de bir hata değil. Model bağlama, bir özelliğin değerine bağlanarak ve typeof olan OrderTemplatesbir ViewBagözelliğe bağlanma girişiminize bağlandığınızda çalışır IEnumerabe<SelectListItem>. Ancak bir <select>öğe, karmaşık nesneler koleksiyonuna bağlanamaz (yalnızca bir değer türü)

Vay canına, bu cevap olmasaydı bütün günümü boşa harcardım. Cidden, bu KÜÇÜK HATA, neden görüntü çantasından kurtulmalıyız
Worthy7

23

Benim için çalışmıyordu, bu şekilde çalıştı:

Denetleyici:

int selectedId = 1;

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

Görünüm:

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

JQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
Denetleyicinizde yanlış sayıda parantez var: Bir açma parantezi ve iki kapatma parantezi var.
Amos Long

7

Bunun gibi bir nesneyi geçtiğinizde:

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

Diyorsunuz ki: Kaynak ( Model) ve Anahtar ( "Code") Metin ( "Name") ve seçilen değer 0. Muhtemelen mülkünüz 0için kaynağınızda bir değer yoktur Code, bu nedenle HTML Yardımcısı gerçek selectedValue değerini bu denetime geçirmek için ilk öğeyi seçecektir.


3

Atamadan önce seçilen değeri kırptığınızdan emin olun.

// Model

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

// Denetleyici

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;

//Görünüm

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

2

Görünümde ne olacağını biliyorsanız, varsayılan değeri Denetleyiciden de ayarlayabilir ve ardından bunu view / cshtml dosyasına ayarlayabilirsiniz. HTML tarafından varsayılan değeri ayarlamaya gerek yoktur.

Controller dosyasında.

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

.Cshtml dosyasında.

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

1

Dersi unutmalısın

Liste Seç

Bunu Kontrol Cihazınızda kullanın :

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

Değeri seçin:

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

Listeyi ViewData'ya ekleyin:

ViewBag.CustomerTypes = customerTypes;

Bunu Görünümünüzde kullanın :

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

-

Daha fazla bilgi için: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc


0

Denetleyici Bölümünü Ekleyin

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

Html Bölümünü Ekleyin

   @Html.DropDownList("Orders", null)

Basit bir yöntem


Kolay bir alternatif işlem
ibrahim ozboluk

0

Benim için genel çözüm :)

@{
     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" })
     }
}

0

Linq to Dropdown ile boş öğe, seçili öğe (% 100 çalışır)
(Kesinlikle Yazılmış, minimum hata şansı) Herhangi bir model değişikliği bağlayıcıya yansıtılacaktır

Kontrolör

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

        return View(sur);
    }

Görünüm

        @{


    //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)

Verileri bağlamak için bu yöntem de mümkündür

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

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

0

Bunun sorunun gerçekten bir cevabı olmadığını biliyorum, ancak bu yazıya tökezlemeye devam ettiğimde, DropDownList'i görünümdeki bir listeden başlatmanın bir yolunu arıyordum.

Hatam, sözlükten şöyle bir Seçim Listesi oluşturmaya çalışmamdı:

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

Daha sonra resmi msdn belgesinde kazmaya başladım ve DropDownListForbunun mutlaka a gerektirmediğini SelectList, bunun yerine bir 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" })

Benim durumumda muhtemelen Model.Localityseçili öğeyi atlayabilirim , çünkü a) tek öğe ve b) SelectListItem.Selectedmülkte zaten belirtiliyor .

Merak ediyorsanız, veri kaynağı SelectWoo / Select2 kontrolü kullanılarak dinamik olarak yüklenen bir AJAX sayfasıdır.


0
public byte UserType
public string SelectUserType

Bir tane almanız ve farklı bir tane ayarlamanız gerekiyor. Seçilen değer, ayarlamak üzere olduğunuz öğe ile aynı olamaz.

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

Listem için Enum sözlüğünü kullanıyorum, bu yüzden "anahtar", "değer" çifti var.


0

Benzer bir sorun yaşadım, ViewBag ve Element adını aynı şekilde kullanıyordum. (Yazım hatası)


0

Bu CSS sorunları. Bootstrap 4'te @ Html.DropDownListFor'un neden işe yaradığını bilmiyorum. Elbette bu sınıf tasarım problemidir. Açılır giriş kutunuzda CSS Dolgusu varsa, çalışma çevresi her neyse: #px, # px; öğesini devre dışı bırakın. Umarım bu işe yarar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.