DropDownListFor HTML Helper无法与模型数据绑定问题求助
问题根因
你同时混用了ASP.NET Core的两种下拉框渲染方式(Tag Helper + HtmlHelper),并且DropDownListFor的参数用法完全错误:
asp-for和asp-items属于Tag Helper语法,asp-items要求传入IEnumerable<SelectListItem>类型的数据源,不能直接塞Html.DropDownListFor的返回值(这个方法返回的是已经渲染好的HTML字符串,不是数据源)DropDownListFor的第一个参数要求是指向模型绑定属性的Lambda表达式,你直接传入Model.Residents列表不符合方法签名要求,自然无法推断泛型参数
解决方法1:仅用Tag Helper(推荐,更简洁)
你后端已经把SelectList存到ViewBag.Zb里了,直接改视图代码就行,不用调用DropDownListFor:
<select asp-for="ResidentAccount" asp-items="@ViewBag.Zb as SelectList" class="form-control foo"> <option value="">Set the Owner</option> </select>
这种写法完全等价于你想要的效果,自动绑定选中值到ResidentAccount属性,自带占位提示项,也能应用你要的foo和form-control样式。
解决方法2:仅用HtmlHelper
如果你坚持用DropDownListFor,就完全不要用select标签的Tag Helper属性,直接写:
@Html.DropDownListFor(model => model.ResidentAccount, ViewBag.Zb as SelectList, "Set the Owner", new { @class = "form-control foo" })
注意第一个参数是Lambda表达式指向你要绑定的属性ResidentAccount,不是整个居民列表,这样泛型参数就能被正确推断,不会报错。
额外优化点(可选)
后端代码里其实不用重复转两次SelectList,你已经生成了List<SelectListItem> items,直接把这个列表塞到ViewBag就行,不用再包一层SelectList:
// 把原有这两行 // SelectList selectList = new SelectList(items, "Text"); // ViewBag.Zb = selectList; // 改成下面这行即可 ViewBag.Zb = items;
视图里对应把as SelectList改成as IEnumerable<SelectListItem>就可以,减少冗余转换。
内容的提问来源于stack exchange,提问作者red guardgen
相关产品推荐
相关产品推荐

