System.Web.Mvc.SelectList转string报错致ItemId无法显示
问题原因
- 核心错误是视图中调用了错误的HtmlHelper辅助方法:
@Html.TextBoxFor是渲染单行文本输入框的方法,它的第二个参数要求传入string类型的格式化字符串,你传入了SelectList类型对象,直接触发了「无法从'System.Web.Mvc.SelectList'转换为'string'」的编译错误。 - 你提到Category ID功能运行正常,是因为实现Category ID时你使用的是
@Html.DropDownListFor下拉框辅助方法,这个方法的第二个参数才支持接收IEnumerable<SelectListItem>类型的选项集合,参数签名完全匹配,所以不会报错。 - 后端构造
SelectListItem时遗漏了Text属性赋值:你只给Value和Selected属性赋了值,Text属性为空,就算修正了辅助方法,下拉选项也不会显示任何文本内容。另外你给所有查询出来的项都设置了Selected = true,下拉框仅支持单个选中项,这个写法也不符合规范。
修复方案
- 修正后端Index1 Action的SelectListItem构造逻辑,补全Text属性,移除全局选中设置,需要默认选中项直接给ViewModel的ItemId属性赋值即可:
public ActionResult Index1() { ItemViewModel objItemViewModel = new ItemViewModel(); objItemViewModel.ListItemId = (from objItem in objShopOnlineDBEntities.Items select new SelectListItem() { Value = objItem.ItemId.ToString(), // 按业务需求给Text赋值,要显示ItemId就传ItemId,要显示商品名称就传对应名称字段 Text = objItem.ItemId.ToString() }).ToList(); // 需要默认选中某一项时,直接给ItemId赋对应值即可,比如默认选中Id为1的项:objItemViewModel.ItemId = "1"; return View(objItemViewModel); }
- 修正视图代码,将
TextBoxFor替换为和Category ID逻辑一致的DropDownListFor,按方法签名正确传参:
<div class="col-md-4"> <div class="form-group"> Item Id : @Html.DropDownListFor(model => model.ItemId, Model.ListItemId, new { @class = "form-control"}) </div> </div>
如果你本来的需求是渲染文本框展示ItemId而非下拉选择框,直接移除多余的SelectList参数即可,文本框写法为
@Html.TextBoxFor(model => model.ItemId, new { @class = "form-control"})。
内容的提问来源于stack exchange,提问作者Rasca Rafael
相关产品推荐
相关产品推荐

