ASP.NET Core 6.0 MVC新增电影流派搜索时抛出模型不兼容异常
问题根因
异常触发的直接原因是强类型视图与控制器传入的模型类型不匹配:
你的Index.cshtml已声明绑定MovieDBApp.Models.MovieGenreViewModel类型,但MoviesController的Index动作目前仍直接返回List<MovieDBApp.Models.Movie>类型的电影列表,没有构造视图要求的视图模型实例,因此运行时抛出类型不兼容的InvalidOperationException。
你之前尝试把视图模型改成IEnumerable<MovieGenreViewModel>的方向是错误的——视图里的下拉框、搜索框都是绑定单个MovieGenreViewModel实例的属性,不是该类型的集合,所以会出现找不到MovieGenre属性的编译错误。
修复方案
1. 补充控制器依赖引用
在MoviesController.cs顶部添加命名空间引用,用于构造下拉框选项:
using Microsoft.AspNetCore.Mvc.Rendering;
2. 重写Index动作方法
将原有的Index方法替换为以下代码,新增流派筛选逻辑,构造符合视图要求的视图模型传入:
// GET: Movies public async Task<IActionResult> Index(string movieGenre, string searchString) { // 提取数据库中所有不重复的电影流派,用于生成下拉选项 IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre; var movies = from m in _context.Movie select m; // 按电影标题模糊搜索 if (!string.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } // 按选中流派精确筛选 if (!string.IsNullOrEmpty(movieGenre)) { movies = movies.Where(x => x.Genre == movieGenre); } // 组装视图所需的视图模型 var viewModel = new MovieGenreViewModel { Genres = new SelectList(await genreQuery.Distinct().ToListAsync()), Movies = await movies.ToListAsync(), MovieGenre = movieGenre, SearchString = searchString }; return View(viewModel); }
3. 优化视图搜索框绑定(可选但推荐)
将Index.cshtml中标题搜索的输入框从原生name绑定改为标签助手绑定,实现搜索后关键词自动回填:
Title: <input type="text" asp-for="SearchString">
修复效果
- 控制器传入模型与视图声明类型完全匹配,原类型不兼容异常消失
- 流派下拉框自动加载数据库中所有存在的电影流派
- 支持标题搜索、流派筛选单独使用,也支持两个条件叠加筛选
- 筛选操作完成后,下拉框选中状态、搜索框输入内容会自动保留,交互逻辑正常
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

