gpt4 book ai didi

asp.net-core - 是否有 Html.GetEnumSelectList() 函数将选项的值设置为所述枚举的值?

转载 作者:行者123 更新时间:2023-12-05 07:21:03 26 4
gpt4 key购买 nike

当为以下枚举使用内置的 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>

最佳答案

您可以为枚举使用属性并获取和使用它,例如此代码获取 DisplayAttribute 值。

public static string GetDisplayName(this Enum value)
{
if (value == null) return String.Empty;
if (Cache.ContainsKey(value))
return Cache[value];

var enumType = value.GetType();
var enumName = Enum.GetName(enumType, value);
var member = enumType.GetMember(enumName)[0];

var attributes = member.GetCustomAttributes(typeof(DisplayAttribute), false);

var outString = ((DisplayAttribute)attributes[0]).ResourceType != null
? ((DisplayAttribute)attributes[0]).GetName()
: ((DisplayAttribute)attributes[0]).Name;

Cache.Add(value, outString);

return outString;
}

我认为您可以为每个枚举值定义属性(通过自定义或可用属性,如您使用的显示属性)并将该值存储在此属性中,并将其用于选项的值或任何地方。

关于asp.net-core - 是否有 Html.GetEnumSelectList<Enum>() 函数将选项的值设置为所述枚举的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57139837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com