ASP.net MVC에서 SelectList에 항목을 추가하는 방법


112

기본적으로 SelectList의 시작 부분에 기본값이 0이고 텍스트 값이 "-Select One--"인 항목을 삽입하려고합니다.

같은 것

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

할 수 있습니까?


2
SelectList실제로 데이터를 항목에 직접 바인딩하는 데 도움이되는 것 같습니다. 항목을 수동으로 추가하는 경우 List<SelectListItem>대신 사용하십시오.
Kai Hartmann

수락 된 답변과 투표 수를 감안할 때 "ASP.net MVC의 SelectList에 빈 값 항목을 어떻게 추가 할 수 있습니까?"라는 대답을 반영하도록 질문을 약간 변경하는 것이 좋습니다. 그러나 신용 및 원래의 응답에 대한 @ H-개 덕분에 "내가 어떻게이 항목을 추가 할 수 있습니다"자체 질문
AndrewD

답변:


150

0 값을 고집하지 않는 한 실제로이 작업을 수행 할 필요가 없습니다. HtmlHelper DropDownList 확장을 사용하면 null 값을 사용하여 선택에서 초기 값으로 표시되는 옵션 레이블을 설정할 수 있습니다. 옵션 레이블이있는 DropDownList 서명 중 하나를 사용하기 만하면됩니다.

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

1
실제로 0의 값을 고집하면 어떨까요? 값이 null / 빈 문자열 인 경우 모델 바인딩에 문제가 발생할 수 있습니다.
Kjensen 2009

2
다시 int로 기대한다면 int를 사용할까요? 선택하지 않은 경우 여전히 null로 둡니다.
tvanfosson

13
이 솔루션의 문제는 선택한 항목을 잃어버린 것입니다.
37Stars 2009

1
@JesseWebb 난 그냥 당신이 옵션 레이블을 포함하는 서명을 사용하고 만들 필요가 의심 msdn.microsoft.com/en-us/library/ee703567.aspx을 , @Html.DropDownListFor( m => m.MenuSelection, (IEnumerable<SelectListItem>)ViewBag.Menu, "Select One", null )널 (null)을 포함하여, 예를 들어 htmlAttributes서명에 피하기 혼란 표현식, 메뉴 열거 및 객체 (htmlAttributes)를받습니다.
tvanfosson

1
@tvanfosson-명확히 해주셔서 감사합니다. SelectList의 IEnumerable에 대한 유형으로 Complex 유형과 함께 사용하려고했습니다. optionLabel 값을 추가 할 때 작동하지 않는 dataValueField및 을 지정해야했습니다 dataTestField. 조금 더 노력하면 효과가있을 수 있지만 대체 솔루션 중 하나를 사용했습니다. 어쨌든 감사합니다!
Jesse Webb

82

SelectListItem을 채우고, List로 변환하고, 인덱스 0에 값을 추가하여이 작업을 수행했습니다.

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

나는 html 헬퍼에 optionLabel 과부하를 사용하는 것이 좋습니다 -> @ Html.DropDownListFor
2b77bee6-5445-4c77-b1eb-4df3e5

17

이것은 가능하다.

//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의 대답을 좋아했지만 @Rajan Rawal과 마찬가지로 선택한 항목 상태를 보존해야했습니다. 그래서 그의 방법에 내 사용자 정의를 추가했습니다.AddFirstItem()

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");
        }

필요한 작업을 수행해야합니다. 선택 목록을 보내면 인덱스 0에있는 항목이있는 선택 목록이 반환됩니다.

삽입해야하는 항목의 텍스트, 값 또는 색인을 사용자 정의 할 수 있습니다.


선택한 값이 있고이를 보존하려면 어떻게해야합니까?
Rajan Rawal 2012

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

5

여기 당신을위한 html 도우미

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 (). 삽입 (..)는 귀하의 목록에 방법을 둔다 요소를. 모든 위치를 지정할 수 있습니다. ToList 다음에 .Insert (0, "--First Item--")를 추가하십시오.

귀하의 코드

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

새 코드

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

2

매우 우아하게 들리지는 않지만 일반적으로 다음과 같이합니다.

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

1

좋아요 저는 깨끗한 코드를 좋아해서 이것을 확장 방법으로 만들었습니다.

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

사용법 (예제) :

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

이 옵션은 여러 가지 방식으로 필요할 수 있으므로 다른 시나리오와 향후 프로젝트에서 사용할 수 있도록 개체를 개발하는 결론에 도달했습니다.

먼저이 클래스를 프로젝트에 추가하십시오.

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 });                    
    }
}

이제 Controller Action에서 다음과 같이 할 수 있습니다.

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

마지막으로 View에서 다음과 같이 코딩합니다.

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

0

해결 방법은 @tvanfosson의 대답 (선택한 대답)을 사용하고 JQuery (또는 Javascript)를 사용하여 옵션 값을 0으로 설정하는 것입니다.

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

도움이 되었기를 바랍니다.


0

다음 코드와 같은 것을 시도하십시오.

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

다른 사람이 더 나은 선택권을 가지고 있다면 ...

<% 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=" "})%>
<% }>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.