首页 > 解决方案 > SelectListItem 显示类的名称而不是文本字段

问题描述

我正在使用 SelectItems 创建一个 SelectList。Text 字段正在进入页面,但 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”

标签: razorasp.net-core-tag-helpers

解决方案


您需要为其添加前缀@

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);

您需要将类型更改为BusinessTypesSelecttoIEnumerable<SelectListItem>而不是SelectList,这很好。你不需要一个SelectList,只需要一个IEnumerable<SelectListItem>。Razor 只是要使用SelectList你现在传递的内容来获取Items它的集合,无论如何,然后创建它自己的。


推荐阅读