You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Razor页面下拉框显示SelectListItem而非实际文本值求助

问题原因

你遇到的问题是因为重复包装了SelectList:控制器里已经把SelectList存入ViewData["DocumentType"],它的元素是SelectListItem对象;但视图里又用new SelectList()把这个已有的SelectList再次包装,导致下拉框渲染时,把每个SelectListItem对象直接转成字符串(默认是类型全名Microsoft.AspNetCore.Mvc.Rendering.SelectListItem),而不是读取它的Text属性。

另外,asp-items必须用@引入C#表达式,移除@会导致Razor无法识别代码,自然编译报错。

解决方案

方案1:直接复用ViewData中的SelectListItem集合

不需要重新构建SelectList,直接取出ViewData["DocumentType"]中的SelectListItem集合,然后通过value属性指定选中项:

@foreach (var item in Model)
{
    <select asp-items="@(ViewData["DocumentType"] as IEnumerable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>)"
            value="@item.SelectedDocumentTypeId.ToString()">
    </select>
}

方案2:用原始实体数据重新构建SelectList

如果需要重新生成SelectList(比如动态调整选中逻辑),不要用ViewData里的SelectList作为数据源,改用原始的实体列表:

控制器代码调整

把原始的DocumentType实体列表也存入ViewData:

var documentTypes = _db.DocumentTypes.ToList();
// 存原始实体列表,用于后续重新构建SelectList
ViewData["DocumentTypeEntities"] = documentTypes;
// 原有的SelectList可以保留,用于其他场景
ViewData["DocumentType"] = new SelectList(documentTypes, "Id", "Name");

视图代码

基于原始实体列表构建SelectList,指定选中项:

@foreach (var item in Model)
{
    <select asp-items="@new SelectList(ViewData["DocumentTypeEntities"] as IEnumerable<YourNamespace.DocumentType>, "Id", "Name", item.SelectedDocumentTypeId)">
    </select>
}

注意替换YourNamespace.DocumentType为你实际的实体类命名空间和类名。

额外提示

  • 如果你用asp-for绑定模型属性,Razor会自动匹配选中项,代码可以更简洁:
    @foreach (var item in Model)
    {
        <select asp-for="@item.SelectedDocumentTypeId" 
                asp-items="@(ViewData["DocumentType"] as IEnumerable<SelectListItem>)">
        </select>
    }
    
    这种方式不需要手动设置value,框架会自动根据asp-for的属性值匹配选中项。

内容的提问来源于stack exchange,提问作者Anjali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:01:09