[C#] 이 ASP.NET MVC SelectList를 작동 시키려면 어떻게해야합니까?

컨트롤러에 selectList를 작성하여 뷰에 표시합니다.

나는 그것을 즉석에서 만들려고 노력하고 있습니다.

myViewData.PageOptionsDropDown = 
   new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");

컴파일되지만 출력이 좋지 않습니다 …

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
    <option>10</option>
    <option>15</option>
    <option>25</option>
    <option>50</option>
    <option>100</option>
    <option>1000</option>
</select>

선택된 항목이 없는지 확인하십시오.

이 문제를 어떻게 해결할 수 있습니까?



답변

이것이 내가하는 방법입니다

IList<Customer> customers = repository.GetAll<Customer>();
IEnumerable<SelectListItem> selectList = 
    from c in customers
    select new SelectListItem
    {
        Selected = (c.CustomerID == invoice.CustomerID),
        Text = c.Name,
        Value = c.CustomerID.ToString()
    };

언뜻보기에 당신이 무엇을하는지 잘 모르겠습니다 …


답변

확장 방법을 사용합니다.

용법

var departmentItems = departments.ToSelectList(d => d.Code + 
                                               " - " + d.Description,
                                               d => d.Id.ToString(),
                                               " - ");

var functionItems = customerFunctions.ToSelectList(f => f.Description, 
                                                   f => f.Id.ToString(), 
                                                   " - ");

public static class MCVExtentions
{
    public static List<SelectListItem> ToSelectList<T>(
        this IEnumerable<T> enumerable, 
        Func<T, string> text, 
        Func<T, string> value, 
        string defaultOption)
    {
        var items = enumerable.Select(f => new SelectListItem()
                                     {
                                         Text = text(f), 
                                         Value = value(f) 
                                     }).ToList();
        items.Insert(0, new SelectListItem()
                    {
                        Text = defaultOption, 
                        Value = "-1" 
                    });
        return items;
    }
}


답변

items, dataValueField, dataTextField, selectedValue매개 변수로 허용되는 생성자를 사용하여 다음을 수행하십시오 .

ViewData["myList"] = 
                new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }
                .Select(x => new {value = x, text = x}), 
                "value", "text", "15");

그렇다면 당신의 관점에서 :

<%=Html.DropDownList("myList") %>


답변

Thomas Stock의 답변을 바탕으로 다음과 같은 오버로드 된 ToSelectList메소드를 만들었습니다 .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

public static partial class Helpers
{
    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, bool selectAll = false)
    {
        return enumerable.ToSelectList(value, value, selectAll);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, object selectedValue)
    {
        return enumerable.ToSelectList(value, value, new List<object>() { selectedValue });
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, IEnumerable<object> selectedValues)
    {
        return enumerable.ToSelectList(value, value, selectedValues);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, bool selectAll = false)
    {
        foreach (var f in enumerable.Where(x => x != null))
        {
            yield return new SelectListItem()
            {
                Value = value(f).ToString(),
                Text = text(f).ToString(),
                Selected = selectAll
            };
        }
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, object selectedValue)
    {
        return enumerable.ToSelectList(value, text, new List<object>() { selectedValue });
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, IEnumerable<object> selectedValues)
    {
        var sel = selectedValues != null
            ? selectedValues.Where(x => x != null).ToList().ConvertAll<string>(x => x.ToString())
            : new List<string>();

        foreach (var f in enumerable.Where(x => x != null))
        {
            yield return new SelectListItem()
            {
                Value = value(f).ToString(),
                Text = text(f).ToString(),
                Selected = sel.Contains(value(f).ToString())
            };
        }
    }
}

컨트롤러에서 다음을 수행 할 수 있습니다.

var pageOptions = new[] { "10", "15", "25", "50", "100", "1000" };
ViewBag.PageOptions = pageOptions.ToSelectList(o => o, "15" /*selectedValue*/);

마지막으로보기에 다음을 입력하십시오.

@Html.DropDownList("PageOptionsDropDown", ViewBag.PageOptions as IEnumerable<SelectListItem>, "(Select one)")

원하는 결과가 나옵니다. 물론 "(Select one)"첫 번째 빈 항목을 원하지 않으면 위 의 optionLabel을 생략 할 수 있습니다 .

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option value="">(Select one)</option>
<option value="10">10</option>
<option selected="selected" value="15">15</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="1000">1000</option>
</select>

업데이트 : 수정 된 코드 목록은 XML 주석과 함께 여기 에서 찾을 수 있습니다 .


답변

문제는 SelectList가 설계된대로 작동한다는 것입니다. 버그는 디자인에 있습니다. SelectedItem에서 Selected 속성을 설정할 수 있지만 GetEnumerator ()로 목록을 탐색하거나 Mvc가 대신하는 경우에는 완전히 무시됩니다. Mvc는 대신 새 SelectListItem을 만듭니다.

SelectList ctor를 SelectListItem [], Text-Name, Value-Name 및 SelectedValue와 함께 사용해야합니다. SelectListItem 자체가 아니라 선택하려는 SelectListItem의 값을 SelectedValue로 전달해야합니다. 예:

SelectList sl = new SelectList( new[]{
  new SelectListItem{ Text="one", Value="1"},
  new SelectListItem{ Text="two", Value="2"},
  new SelectListItem{ Text="three", Value="3"}
}, "Text", "Value", "2" );

(이것을 테스트하지는 않았지만 같은 문제가 있습니다)

두 번째 옵션은 selected = “selected”속성을 얻습니다. 좋은 오래된 DataSets처럼 보입니다. 😉


답변

이것은 옵션입니다 :

myViewData.PageOptionsDropDown = new[]
{
 new SelectListItem { Text = "10", Value = "10" },
 new SelectListItem { Text = "15", Value = "15", Selected = true }
 new SelectListItem { Text = "25", Value = "25" },
 new SelectListItem { Text = "50", Value = "50" },
 new SelectListItem { Text = "100", Value = "100" },
 new SelectListItem { Text = "1000", Value = "1000" },
}


답변

그것이 문자 그대로 모든 일이라면 배열을 문자열로 선언하면 선택한 항목 문제가 해결됩니다.

myViewData.PageOptionsDropDown =
   new SelectList(new string[] {"10", "15", "25", "50", "100", "1000"}, "15");