【发布时间】:2019-11-30 01:32:57
【问题描述】:
当为以下枚举使用内置 Html.GetEnumSelectList() 时:
public enum Country {
[Display(Name="United States")] US,
[Display(Name="Canada")] CA
}
它会生成以下html:
<select id="prefix" class="form-control">
<option value="0">United States</option>
<option value="1">Canada</option>
</select>
有没有办法将值设置为枚举的值而不是索引?
我为我需要的东西写了一个扩展,但它是如此基础,以至于 C# 团队错过了它感觉很奇怪,所以我很好奇我是否这样做了
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace HotelMaven.Extensions {
public static class HtmlExtensions {
public static IEnumerable<SelectListItem> GetEnumSelectList<TEnum>(this IHtmlHelper html, TEnum selectedValue) where TEnum : struct {
var values = Enum.GetValues(typeof(TEnum))
.Cast<TEnum>();
return values.Select(eachValue => new SelectListItem {
Text = eachValue.GetType().GetField(eachValue.ToString()).GetCustomAttribute<DisplayAttribute>()?.Name,
Value = eachValue.ToString(),
Selected = eachValue.Equals(selectedValue)
});
}
public static IEnumerable<SelectListItem> GetEnumSelectList<TEnum>(this IHtmlHelper html, bool isValueUsedForValue) where TEnum : struct {
if (!isValueUsedForValue) return html.GetEnumSelectList<TEnum>();
var values = Enum.GetValues(typeof(TEnum))
.Cast<TEnum>();
return values.Select(eachValue => new SelectListItem {
Text = eachValue.GetType().GetField(eachValue.ToString()).GetCustomAttribute<DisplayAttribute>()?.Name,
Value = eachValue.ToString()
});
}
}
}
这导致了我正在寻找的结果:
<select id="prefix" class="form-control">
<option selected="selected" value="US">United States</option>
<option value="CA">Canada</option>
</select>
使用:
<select asp-items="Html.GetEnumSelectList<Country>(Country.US)" id="country" class="form-control"></select>
【问题讨论】:
标签: asp.net-core razor