.NET Core - 在使用 Select Tag Heller 时,有没有办法将枚举设置为具有默认值?

.NET Core - Is there a way to set an enum to have a default value when using a Select Tag Helpler?

所以我通过 .NET Core 标签助手将枚举转换为下拉列表。挺标准的。

枚举

public enum DistanceType
{
    [Display(Name = "1 Mile")]
    [Description("1")]
    OneMile = 1,

    [Display(Name = "5 Miles")]
    [Description("5")]
    FiveMiles = 2,

    [Display(Name = "10 Miles")]
    [Description("10")]
    TenMiles = 3,

    [Display(Name = "20 Miles")]
    [Description("20")]
    TwentyMiles = 4
}

查看

<select asp-for="EnumDistanceType" asp-items="Html.GetEnumSelectList<DistanceType>()">
</select>

所以我想做的是,每次我将此枚举渲染到下拉列表中时,我希望它 select 默认为第一个值以外的值。因此,例如,每次我呈现下拉菜单时,它都会向用户显示“5 英里”而不是“1 英里”。不过我不想更改枚举的顺序,我希望下拉菜单位于第二个对象上。

有没有一些简单的方法可以通过在枚举上使用标签来做到这一点?或者,如果不在枚举中,是否有某种方法可以在标签助手中执行此操作?

谢谢。

您需要为您的模型实例设置 EnumDistanceType 属性 的值。

假设您的模型 class 是

public class DistanceViewModel
{
    public DistanceType EnumDistanceType { get; set; }
}

那么你的控制器动作可能是:

public IActionResult DistanceOption(int id)
{
    var model = new DistanceViewModel();
    model.EnumDistanceType = DistanceType.FiveMiles;
    return View(model);
}

这对我有用。 看看:)

<select asp-for="EnumDistanceType" asp-items="Html.GetEnumSelectList<DistanceType>()">
    <option selected value="2">FiveMiles</option>
</select>
    public static class HtmlHelperExtensions
    {
        public static IEnumerable<SelectListItem> GetEnumSelectListWithDefaultValue<TEnum>(this IHtmlHelper htmlHelper, TEnum defaultValue) 
            where TEnum : struct
        {
            var selectList = htmlHelper.GetEnumSelectList<TEnum>().ToList();
            selectList.Single(x => x.Value == $"{(int)(object)defaultValue}").Selected = true;
            return selectList;
        }
    }

用法:

<select asp-for="EnumProperty" asp-items="Html.GetEnumSelectListWithDefaultValue<SomeEnum>(defaultValue: SomeEnum.SomeEnumValue)">
</select>