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
相关产品推荐
相关产品推荐

