You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:27:18