Используйте GetEnumSelectList <T>при отображении только предварительно выбранных значений - PullRequest
0 голосов
/ 14 июля 2020

Есть ли способ использовать GetEnumSelectList, когда раскрывающийся список заполнен только элементами, которые я могу выбрать заранее? Все примеры, которые я нашел, работают с 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
}

1 Ответ

0 голосов
/ 14 июля 2020
  • Вы можете использовать методы расширения Linq в атрибутах asp-.
  • Но поскольку SelectListItem не содержит необработанных значений перечисления, вам необходимо использовать Int32.Parse или Int32.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>

Намного лучше!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...