SelectListItem показывает имя класса, а не текстовое поле - PullRequest
0 голосов
/ 27 июня 2019

Я создаю SelectList с помощью SelectItems. Поле Text попадает на страницу, но свойство Text не заполняется текстом, вместо этого используется имя класса, я не могу понять, что я могу делать неправильно.

Я обнаружил, что существует ситуация, когда не должно быть отдельного закрытия для тега (), а скорее />. Это сделало список выбора пустым.

Это код в контроллере (как я уже сказал, значение передается на страницу при отладке)

var vitualOfficeManagerViewModel = new VirtualOfficeManagerViewModel();

var enumForSelectList = _context.BusinessType.AsEnumerable().Select(b = >new {
    b.Name,
    b.Id
});

var initalizeSelectListToAddTo = new List < SelectListItem > ();
foreach(var item in enumForSelectList) {
    var x = new SelectListItem(item.Name.ToString(), item.Id.ToString());
    initalizeSelectListToAddTo.Add(x);
}
vitualOfficeManagerViewModel.BusinessTypesSelect = new SelectList(initalizeSelectListToAddTo);

//var testt = new SelectList()
return View(vitualOfficeManagerViewModel);

И это код, который я имею в cshtml

<div class="form-group">
    <select asp-for="BusinessTypes"
            asp-items="Model.BusinessTypesSelect">
    </select>
</div>

Я ожидаю, что список будет иметь значение свойства Text, например "Компьютерное программирование"

но результат - «Microsoft.AspNetCore.Mvc.Rendering.SelectListItem»

1 Ответ

1 голос
/ 27 июня 2019

Вам необходимо добавить префикс @:

asp-items="@Model.BusinessTypesSelect">

Это разыменовывает его, передавая фактическое значение вместо самого свойства.

Кроме того, FWIW, вы делаете много бесполезных изменений в ваших данных. Все ваше действие может быть сокращено до:

var vitualOfficeManagerViewModel = new VirtualOfficeManagerViewModel
{
    BusinessTypesSelect = _context.BusinessType.Select(b => new SelectListItem
    {
        Value = b.Id.ToString(),
        Text = b.Name
    })
};

return View(vitualOfficeManagerViewModel);

Вам нужно изменить тип BusinessTypesSelect на IEnumerable<SelectListItem> вместо SelectList, что нормально. Вам не нужен SelectList, только IEnumerable<SelectListItem>. Razor просто собирается использовать SelectList, который вы проходите прямо сейчас, чтобы в любом случае получить коллекцию Items, а затем создать свою собственную.

...