ASP.NET MVC中DropDownList使用lambda表达式报类型转换错误
ASP.NET MVC 编译错误:无法将lambda表达式转换为类型“string”,因为它不是委托类型
错误根因
问题出在HTML辅助方法的选型错误:
- 代码中调用的
@Html.DropDownList()是弱类型辅助方法,它的第一个参数要求传入string类型的表单字段名,不支持接收lambda表达式,传入lambda时就会触发题目中的类型转换错误。 - 同页面无报错的
@Html.LabelFor()是带For后缀的强类型辅助方法,这类方法的第一个参数原生支持接收Expression<Func<TModel, TProperty>>类型的lambda表达式,可以直接绑定模型属性、提供编译时类型校验,因此相同的lambda表达式在这个方法下可以正常运行。
核心规则:Razor视图中只有名称以
For结尾的HTML辅助方法(如LabelFor、TextBoxFor、DropDownListFor)才支持lambda表达式做强类型绑定;不带For后缀的方法(如Label、TextBox、DropDownList)仅接受字符串类型的属性名参数,无编译时类型检查能力。
修复方案
将弱类型的DropDownList替换为对应的强类型方法DropDownListFor即可,修改后的视图代码如下:
<div class="form-group"> @Html.LabelFor(m => m.Movie.GenreId) @Html.DropDownListFor(m => m.Movie.GenreId, new SelectList(Model.Genres, "Id", "Name"), "Select a Genre", new { @class = "form-control" }) </div>
额外避坑提示
当前控制器的NewMovie动作方法存在潜在空引用问题:当传入的id没有匹配的数据库记录(比如新增电影场景,id默认值为0)时,SingleOrDefault会返回null,视图渲染时访问Model.Movie.GenreId会直接抛出空引用异常,建议补充默认对象初始化逻辑:
public ActionResult NewMovie(int id) { var movie = id == 0 ? new Movies() : _context.Movies.SingleOrDefault(m => m.Id == id); var viewModel = new MovieFormViewModel { Movie = movie, Genres = _context.Genres.ToList() }; return View("MovieForm", viewModel); }
内容的提问来源于stack exchange,提问作者Kail32
相关产品推荐
相关产品推荐

