컨트롤러에 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");