0

有什么方法可以使用 GetEnumSelectList 而 Dropdownlist 只填充了我可以预先选择的项目?我发现的所有示例都适用于 Viewbag 或其他一些解决方法,但我希望有一个更清洁的解决方案。

这就是我在视图中使用它的方式,它显示了枚举中的所有值:

<select asp-for="evOwner.evpriority" class="form-control" asp-items="Html.GetEnumSelectList<EVOwnerType>()">
                                    <option selected="selected" value="">please select</option>
</select>

这是我的枚举,我只想显示要在下拉列表中选择的 guest 和 vip:

public enum EVOwnerType
{
    [Display(Name = "")]
    employee = 0,
    [Display(Name = "")]
    vip = 1,
    [Display(Name = "")]
    guest = 2,
    [Display(Name = "")]
    notDriver = 3
}
4

1 回答 1

0
  • asp-您可以在属性中使用 Linq 扩展方法。
  • 但由于SelectListItem不包含原始枚举值,您需要使用Int32.ParseInt32.TryParse获取这些值。
  • 如果 ASP.NET 决定将您的枚举值呈现为文本/字符串而不是整数,这将中断。
Html
    .GetEnumSelectList<EVOwnerType>()
    .Select( opt => ( opt, value: (EVOwnerType)Int32.Parse( opt.Value ) ) )
    .Where( t => t.value == EVOwnerType.vip || t.value == EVOwnerType.guest || t.value == this.Model.evOwner.evpriority )
    .Select( t => t.opt )

这将需要打包成一行:

<select asp-for="evOwner.evpriority" class="form-control" asp-items="Html.GetEnumSelectList<EVOwnerType>().Select( opt => ( opt, value: (EVOwnerType)Int32.Parse( opt.Value ) ) ).Where( t => t.value == EVOwnerType.vip || t.value == EVOwnerType.guest || t.value == this.Model.evOwner.evpriority ).Select( t => t.opt )">
    <option selected="selected" value="">please select</option>
</select>

......这不漂亮。

这就是为什么你真的应该单独生成列表(在你的控制器操作中,或者@{}在你视图中的代码块中)。


或者:在视图中的 Razor 代码块中生成列表:

考虑这个替代方案:

@{
    List<SelectListItem> enumItems = this.Html.GetEnumSelectList<EVOwnerType>()
        .Select( opt => ( opt, value: (EVOwnerType)Int32.Parse( opt.Value ) ) )
        .Where( t => t.value == EVOwnerType.vip || t.value == EVOwnerType.guest || t.value == this.Model.evOwner.evpriority )
        .Select( t => t.opt )
        .ToList();
}

<!-- etc -->

<select asp-for="evOwner.evpriority" class="form-control" asp-items="enumItems">
    <option selected="selected" value="">please select</option>
</select>

好多了!

于 2020-07-14T09:43:34.537 回答