열거 형 값을 SelectList로 가져 오는 방법
다음과 같은 열거 형이 있다고 상상해보십시오 (예제처럼).
public enum Direction{
Horizontal = 0,
Vertical = 1,
Diagonal = 2
}
열거의 내용이 나중에 변경 될 수 있으므로 이러한 값을 System.Web.Mvc.SelectList로 가져 오는 루틴을 어떻게 작성할 수 있습니까? 다음과 같이 각 열거 형 이름을 옵션 텍스트로 가져오고 해당 값을 값 텍스트로 가져오고 싶습니다.
<select>
<option value="0">Horizontal</option>
<option value="1">Vertical</option>
<option value="2">Diagonal</option>
</select>
이것이 내가 지금까지 생각 해낼 수있는 최선의 방법입니다.
public static SelectList GetDirectionSelectList()
{
Array values = Enum.GetValues(typeof(Direction));
List<ListItem> items = new List<ListItem>(values.Length);
foreach (var i in values)
{
items.Add(new ListItem
{
Text = Enum.GetName(typeof(Direction), i),
Value = i.ToString()
});
}
return new SelectList(items);
}
그러나 이것은 항상 옵션 텍스트를 'System.Web.Mvc.ListItem'으로 렌더링합니다. 이것을 통해 디버깅하면 Enum.GetValues ()가 예상했던 것처럼 0, 1 대신 'Horizontal, Vertical'등을 반환한다는 것을 보여 주므로 Enum.GetName ()과 Enum의 차이점이 무엇인지 궁금합니다. GetValue ().
열거 형의 값을 얻으려면 열거 형을 기본 형식으로 캐스팅해야합니다.
Value = ((int)i).ToString();
이 일을해야했던 지 오래되었지만이게 효과가있을 것 같아요.
var directions = from Direction d in Enum.GetValues(typeof(Direction))
select new { ID = (int)d, Name = d.ToString() };
return new SelectList(directions , "ID", "Name", someSelectedValue);
이를 위해 ASP.NET MVC 5.1에 새로운 기능이 있습니다.
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum
@Html.EnumDropDownListFor(model => model.Direction)
이것은 내가 방금 만든 것이며 개인적으로 섹시하다고 생각합니다.
public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
{
return (Enum.GetValues(typeof(T)).Cast<T>().Select(
enu => new SelectListItem() { Text = enu.ToString(), Value = enu.ToString() })).ToList();
}
결국 번역 작업을 수행 할 것이므로 Value = enu.ToString ()이 어딘가에 무언가를 호출 할 것입니다.
Dann의 솔루션과 매우 유사한 작업을하고 싶었지만 Value는 int이고 텍스트는 Enum의 문자열 표현이 필요했습니다. 이것이 내가 생각 해낸 것입니다.
public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
{
return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = Enum.GetName(typeof(T), e), Value = e.ToString() })).ToList();
}
ASP.NET Core MVC에서이 작업은 태그 도우미 로 수행됩니다 .
<select asp-items="Html.GetEnumSelectList<Direction>()"></select>
또는:
foreach (string item in Enum.GetNames(typeof(MyEnum)))
{
myDropDownList.Items.Add(new ListItem(item, ((int)((MyEnum)Enum.Parse(typeof(MyEnum), item))).ToString()));
}
return
Enum
.GetNames(typeof(ReceptionNumberType))
.Where(i => (ReceptionNumberType)(Enum.Parse(typeof(ReceptionNumberType), i.ToString())) < ReceptionNumberType.MCI)
.Select(i => new
{
description = i,
value = (Enum.Parse(typeof(ReceptionNumberType), i.ToString()))
});
질문에 대한 정확한 대답은 아니지만 CRUD 시나리오에서는 일반적으로 다음과 같은 것을 구현합니다.
private void PopulateViewdata4Selectlists(ImportJob job)
{
ViewData["Fetcher"] = from ImportFetcher d in Enum.GetValues(typeof(ImportFetcher))
select new SelectListItem
{
Value = ((int)d).ToString(),
Text = d.ToString(),
Selected = job.Fetcher == d
};
}
PopulateViewdata4Selectlists
View ( "Create") 및 View ( "Edit") 전에 호출 된 다음 View에서 호출됩니다.
<%= Html.DropDownList("Fetcher") %>
그리고 그게 전부입니다..
public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
{
if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");
var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
//var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };
return new SelectList(values, "ID", "Name", enumObj);
}
public static SelectList ToSelectList<TEnum>(this TEnum enumObj, string selectedValue) where TEnum : struct
{
if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");
var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
//var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };
if (string.IsNullOrWhiteSpace(selectedValue))
{
return new SelectList(values, "ID", "Name", enumObj);
}
else
{
return new SelectList(values, "ID", "Name", selectedValue);
}
}
여러 가지 이유로 더 많은 클래스와 메서드가 있습니다.
항목 컬렉션에 대한 열거 형
public static class EnumHelper
{
public static List<ItemDto> EnumToCollection<T>()
{
return (Enum.GetValues(typeof(T)).Cast<int>().Select(
e => new ItemViewModel
{
IntKey = e,
Value = Enum.GetName(typeof(T), e)
})).ToList();
}
}
컨트롤러에서 선택 목록 만들기
int selectedValue = 1; // resolved from anywhere
ViewBag.Currency = new SelectList(EnumHelper.EnumToCollection<Currency>(), "Key", "Value", selectedValue);
MyView.cshtml
@Html.DropDownListFor(x => x.Currency, null, htmlAttributes: new { @class = "form-control" })
많은 열거 형 선택 목록이 있었고 많은 사냥과 선별 끝에 일반 도우미를 만드는 것이 가장 효과적이라는 것을 알았습니다. 인덱스 또는 설명자를 선택 목록 값으로 반환하고 설명을 선택 목록 텍스트로 반환합니다.
열거 형 :
public enum Your_Enum
{
[Description("Description 1")]
item_one,
[Description("Description 2")]
item_two
}
돕는 사람:
public static class Selectlists
{
public static SelectList EnumSelectlist<TEnum>(bool indexed = false) where TEnum : struct
{
return new SelectList(Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(item => new SelectListItem
{
Text = GetEnumDescription(item as Enum),
Value = indexed ? Convert.ToInt32(item).ToString() : item.ToString()
}).ToList(), "Value", "Text");
}
// NOTE: returns Descriptor if there is no Description
private static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
return attributes[0].Description;
else
return value.ToString();
}
}
사용법 : 인덱스의 경우 매개 변수를 'true'로 값으로 설정합니다.
var descriptorsAsValue = Selectlists.EnumSelectlist<Your_Enum>();
var indicesAsValue = Selectlists.EnumSelectlist<Your_Enum>(true);
참고 URL : https://stackoverflow.com/questions/1110070/how-to-get-the-values-of-an-enum-into-a-selectlist
'Programing' 카테고리의 다른 글
IIS 구성 오류-이 구성 섹션은이 경로에서 사용할 수 없습니다. (0) | 2020.11.16 |
---|---|
Swift 3 오류에서 코드 액세스 (0) | 2020.11.16 |
Spring MVC Controller에서 IP 주소를 추출하는 방법은 무엇입니까? (0) | 2020.11.16 |
컴퓨터 종료 (0) | 2020.11.16 |
Android / FBReaderJ / gen이 이미 존재하지만 소스 폴더가 아닙니다. (0) | 2020.11.16 |