ASP.net MVC'de bir SelectList'e nasıl öğe ekleyebilirim


112

Temel olarak, varsayılan değeri 0 ve Metin Değeri "- Birini Seç -" olan bir SelectList'in başına bir öğe eklemek istiyorum

Gibi bir şey

SelectList list = new SelectList(repository.func.ToList());
ListItem li = new ListItem(value, value);
list.items.add(li);

Bu yapılabilir mi?


2
SelectListgerçekten verileri doğrudan öğelere bağlamak için sadece bir yardımcı gibi görünüyor. Öğeleri manuel olarak eklerseniz List<SelectListItem>bunun yerine kullanın.
Kai Hartmann

Kabul edilen yanıt ve oy sayısı göz önüne alındığında, soruyu şu yanıtı yansıtacak şekilde biraz değiştirmenizi önerebilir miyim, "ASP.net MVC'de bir SelectList'e boş değerli bir öğeyi nasıl ekleyebilirim?"? Ancak orijinal "Nasıl öğe ekleyebilirim" sorusunu yanıtladığınız için @ h-
dog'a

Yanıtlar:


150

0 değerinde ısrar etmediğiniz sürece bunu yapmaya gerçekten gerek yoktur. HtmlHelper DropDownList uzantısı, seçimde boş bir değerle başlangıç ​​değeri olarak görünen bir seçenek etiketi ayarlamanıza olanak tanır. Seçenek etiketine sahip DropDownList imzalarından birini kullanmanız yeterlidir.

<%= Html.DropDownList( "DropDownValue",
                       (IEnumerable<SelectListItem>)ViewData["Menu"],
                        "-- Select One --" ) %>

1
Ya gerçekten 0'ın değeri konusunda ısrar ederseniz? Değer null / boş bir dizeyse, model bağlamayla ilgili sorunlara neden olabilir.
Kjensen

2
Bir int olarak geri bekliyorsanız, o zaman int kullanır mıyım? ve seçim yapılmadıysa yine de boş bırakın.
tvanfosson

13
Bununla ilgili sorun, seçili öğenizi kaybetmenizdir.
37Stars

1
@JesseWebb İmza ile karışıklığı önlemek için örneğin msdn.microsoft.com/en-us/library/ee703567.aspx gibi seçenek etiketini içeren bir imza kullandığınızdan emin olmanız gerektiğinden şüpheleniyorum bu bir ifade, menü numaralandırması ve bir nesne (htmlAttributes) alır. @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null )htmlAttributes
tvanfosson

1
@tvanfosson - Açıkladığınız için teşekkürler. SelectList'teki IEnumerable için tür olarak Karmaşık bir türle kullanmayı denedim. Bir optionLabel değeri eklerken bunun işe yaramamasına neden olan dataValueFieldve belirtmek zorunda kaldım dataTestField. Muhtemelen biraz daha çabayla işe yarayabilirdi ama ben sadece alternatif çözümlerden birini kullandım. Yine de teşekkürler!
Jesse Webb

82

Bunu bir SelectListItem Doldurarak, Listeye dönüştürerek ve 0 dizinine bir değer ekleyerek çalıştırdım.

List<SelectListItem> items = new SelectList(CurrentViewSetups, "SetupId", "SetupName", setupid).ToList(); 
items.Insert(0, (new SelectListItem { Text = "[None]", Value = "0" }));
ViewData["SetupsSelectList"] = items;

HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

17

Bu mümkün.

//Create the select list item you want to add
SelectListItem selListItem = new SelectListItem() { Value = "null", Text = "Select One" };

//Create a list of select list items - this will be returned as your select list
List<SelectListItem> newList = new List<SelectListItem>();

//Add select list item to list of selectlistitems
newList.Add(selListItem);

//Return the list of selectlistitems as a selectlist
return new SelectList(newList, "Value", "Text", null);

HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

13

@ AshOoO'nun cevabını beğendim ama @Rajan Rawal gibi, eğer varsa seçili öğenin durumunu korumam gerekiyordu. Ben de onun yöntemine kişiselleştirmemi ekledimAddFirstItem()

public static SelectList AddFirstItem(SelectList origList, SelectListItem firstItem)
{
    List<SelectListItem> newList = origList.ToList();
    newList.Insert(0, firstItem);

    var selectedItem = newList.FirstOrDefault(item => item.Selected);
    var selectedItemValue = String.Empty;
    if (selectedItem != null)
    {
        selectedItemValue = selectedItem.Value;
    }

    return new SelectList(newList, "Value", "Text", selectedItemValue);
}

HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

5
private SelectList AddFirstItem(SelectList list)
        {
            List<SelectListItem> _list = list.ToList();
            _list.Insert(0, new SelectListItem() { Value = "-1", Text = "This Is First Item" });
            return new SelectList((IEnumerable<SelectListItem>)_list, "Value", "Text");
        }

Bu, ihtiyacınız olanı yapmalıdır, sadece seçim listenizi gönderin ve 0 indeksinde bir öğe ile bir seçim listesi döndürür.

Eklemeniz gereken öğenin metnini, değerini ve hatta dizinini saklayabilirsiniz


Ya seçilmiş bazı değerlerim varsa ve onları korumak istersem?
Rajan Rawal

HtmlHelper -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

5

İşte size html yardımcısı

public static SelectList IndividualNamesOrAll(this SelectList Object)
{
    MedicalVarianceViewsDataContext LinqCtx = new MedicalVarianceViewsDataContext();

    //not correct need individual view!
    var IndividualsListBoxRaw =  ( from x in LinqCtx.ViewIndividualsNames 
                                 orderby x.FullName
                                 select x);

    List<SelectListItem> items = new SelectList (
                               IndividualsListBoxRaw, 
                              "First_Hospital_Case_Nbr", 
                              "FullName"
                               ).ToList();

    items.Insert(0, (new SelectListItem { Text = "All Individuals", 
                                        Value = "0.0", 
                                        Selected = true }));

    Object = new SelectList (items,"Value","Text");

    return Object;
}

3

.ToList (). Insert (..) sizin Listesine yöntem koyar unsurunu. Herhangi bir pozisyon belirtilebilir. ToList'ten sonra .Insert (0, "- - İlk Öğe - -") ekleyin

Senin kodun

SelectList list = new SelectList(repository.func.ToList());
ListItem li = new ListItem(value, value);
list.items.add(li);

Yeni kod

SelectList list = new SelectList(repository.func.ToList().Insert(0, "- - First Item - -"));
ListItem li = new ListItem(value, value);
list.items.add(li);

2

Kulağa çok şık gelmeyebilir, ama genellikle şöyle bir şey yaparım:

    var items = repository.func.ToList();
    items.Insert(0, new funcItem { ID = 0, TextValue = "[None]" });
    ViewBag.MyData = new SelectList(items);

1

Tamam, temiz kodu seviyorum, bu yüzden bunu bir uzantı yöntemi yaptım

static public class SelectListHelper
{
    static public SelectList Add(this SelectList list, string text, string value = "", ListPosition listPosition = ListPosition.First)
    {
        if (string.IsNullOrEmpty(value))
        {
            value = text;
        }
        var listItems = list.ToList();
        var lp = (int)listPosition;
        switch (lp)
        {
            case -1:
                lp = list.Count();
                break;
            case -2:
                lp = list.Count() / 2;
                break;
            case -3:
                var random = new Random();
                lp = random.Next(0, list.Count());
                break;
        }
        listItems.Insert(lp, new SelectListItem { Value = value, Text = text });
        list = new SelectList(listItems, "Value", "Text");
        return list;
    }

    public enum ListPosition
    {
        First = 0,
        Last = -1,
        Middle = -2,
        Random = -3
    }
}

Kullanım (örnek olarak):

var model = new VmRoutePicker
    {
     Routes =
     new SelectList(_dataSource.Routes.Select(r => r.RouteID).Distinct())
     };                                     
  model.Routes = model.Routes.Add("All", "All", SelectListHelper.ListPosition.Random);
//or
  model.Routes = model.Routes.Add("All");

1

Bu seçeneğin pek çok farklı şekilde ihtiyaç duyabileceği için, farklı senaryolarda ve ilerideki projelerde kullanılabilmesi için bir nesne geliştirme sonucuna vardım.

önce bu sınıfı projenize ekleyin

public class SelectListDefaults
{
    private IList<SelectListItem> getDefaultItems = new List<SelectListItem>();

    public SelectListDefaults()
    {
        this.AddDefaultItem("(All)", "-1");
    }
    public SelectListDefaults(string text, string value)
    {
        this.AddDefaultItem(text, value);
    }
    public IList<SelectListItem> GetDefaultItems
    {
        get
        {                
            return getDefaultItems;
        }

    }
    public void AddDefaultItem(string text, string value)
    {        
        getDefaultItems.Add(new SelectListItem() { Text = text, Value = value });                    
    }
}

Şimdi Kontrolör Eyleminde bunu yapabilirsiniz

    // Now you can do like this
    ViewBag.MainCategories = new SelectListDefaults().GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "-1"));
    // Or can change it by such a simple way
    ViewBag.MainCategories = new SelectListDefaults("Any","0").GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "0"));
    // And even can add more options
    SelectListDefaults listDefaults = new SelectListDefaults();
    listDefaults.AddDefaultItme("(Top 5)", "-5");
    // If Top 5 selected by user, you may need to do something here with db.MainCategories, or pass in parameter to method 
    ViewBag.MainCategories = listDefaults.GetDefaultItems.Concat(new SelectList(db.MainCategories, "MainCategoryID", "Name", Request["DropDownListMainCategory"] ?? "-1"));

Ve nihayet View'de böyle kodlayacaksınız.

@Html.DropDownList("DropDownListMainCategory", (IEnumerable<SelectListItem>)ViewBag.MainCategories, new { @class = "form-control", onchange = "this.form.submit();" })

0

Çözüm, @ tvanfosson'ın cevabını (seçilen cevap) kullanmak ve seçeneğin değerini 0 olarak ayarlamak için JQuery'yi (veya Javascript) kullanmaktır:

$(document).ready(function () {
        $('#DropDownListId option:first').val('0');
    });

Bu yardımcı olur umarım.


0

Aşağıdaki kod gibi bir şey deneyin:

MyDAO MyDAO = new MyDAO();    
List<MyViewModel> _MyDefault = new List<MyViewModel>() {
                new MyViewModel{
                    Prop1= "All",
                    Prop2 = "Select all"
                }
            };
            ViewBag.MyViewBag= 
                new SelectList(MyDAO
                .MyList().Union(
                    _MyDefault
                    ), "Prop1", "Prop2");

-5

Başka birinin daha iyi bir seçeneği varsa bilmiyorum ...

<% if (Model.VariableName == "" || Model.VariableName== null) { %>
   <%= html.DropDpwnList("ListName", ((SelectList) ViewData["viewName"], "", 
        new{stlye=" "})%>
<% } else{ %>
<%= html.DropDpwnList("ListName", ((SelectList) ViewData["viewName"], 
        Model.VariableName, new{stlye=" "})%>
<% }>
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.