Как получить значение перечисления для выпадающего списка? В настоящее время и текст, и значение совпадают - PullRequest
1 голос
/ 30 сентября 2019

Я использую C # MVC. У меня есть эта модель и enum

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Gender Gender { get; set; }
}

public enum Gender
{
    Male, Female, Others
}

Допустим, я хочу отфильтровать свой enum, у меня есть это в моем методе действия контроллера

    public ActionResult Create()
    {            
        var roles = Enum.GetNames(typeof(Gender))
                         .Where(f => f != Gender.Others.ToString())
                         .Select(f => new SelectListItem { Value = f, Text = f }).ToList();

        ViewBag.Roles = roles;
        return View();
    }

и на мой взгляд

@Html.DropDownList("Roles", null, new { @class = "form-control" })

Но проблема в том, что рендер выпадающего списка

<select class="form-control" id="Roles" name="Roles"><option value="Male">Male</option><option value="Female">Female</option></select>

Что я хочу, это

<select class="form-control" id="Roles" name="Roles"><option value="1">Male</option><option value="2">Female</option></select>

Как получить значение перечисления для выпадающего списка? В настоящее время и текст, и значение совпадают.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Вам нужно повторно ввести int, а затем повторно ввести в строку. Потому что ..
- вы используете Enum.GetNames, которые возвращают строковые значения вместо int.
- разбирают имя в значение enum и вводят в int, а затем в string, потому что SelectListItem.Value требует строку в качестве значения.

Так что вам нужно что-то вроде этого

var roles = Enum.GetNames(typeof(Gender))
                .Where(f => f != Gender.Others.ToString())
                .Select(f => new SelectListItem { Value = ((int) Enum.Parse<Gender>(f)).ToString(), Text = f }).ToList();

Второй вариант

Вы можете использовать GetValues вместо GetNames

var roles2 = ((Gender[]) Enum.GetValues(typeof(Gender))).ToList()
                .Where(f => f.ToString() != Gender.Others.ToString())
                .Select(f => new SelectListItem { Value = ((int) f).ToString(), Text = f.ToString() }).ToList();

PS: Я не знаю, что лучше для производительности.

0 голосов
/ 30 сентября 2019

Измените ваше перечисление, как показано ниже:

public enum Gender
{
    Male=1, Female=2, Others=3
}

Теперь измените значения фильтра

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