ASP.NET Core MVC中如何实现int类型的搜索功能
新增int类型搜索能力的实现方案
方案1:无前端改动,自动兼容输入
无需修改现有前端搜索框,自动判断输入内容是否为数字,可转为int时同时匹配数字字段(如电影ID、上映年份等),无法转换时仅搜索标题。
public async Task<IActionResult> Index(string searchString) { var movies = from m in _context.Movie select m; if (!String.IsNullOrEmpty(searchString)) { // 先在查询外完成int类型转换,避免EF Core翻译报错 bool isNumeric = int.TryParse(searchString, out int searchNum); movies = movies.Where(s => s.Title.Contains(searchString) // 是数字时追加匹配int类型字段,可根据你的实际字段调整 || (isNumeric && (s.Id == searchNum || s.ReleaseYear == searchNum)) ); } return View(await movies.ToListAsync()); }
方案2:新增搜索类型选择,匹配更精准
适合需要避免误匹配的场景,前端新增下拉框选择搜索维度,后端按选择的类型执行对应搜索逻辑。
后端代码
// 新增searchType参数接收前端的搜索类型 public async Task<IActionResult> Index(string searchString, string searchType) { var movies = from m in _context.Movie select m; if (!String.IsNullOrEmpty(searchString)) { switch(searchType) { case "title": movies = movies.Where(s => s.Title.Contains(searchString)); break; case "id": if(int.TryParse(searchString, out int targetId)) { movies = movies.Where(s => s.Id == targetId); } else { // 输入不是合法int时返回空结果 movies = movies.Take(0); } break; case "releaseYear": if(int.TryParse(searchString, out int targetYear)) { movies = movies.Where(s => s.ReleaseYear == targetYear); } else { movies = movies.Take(0); } break; } } return View(await movies.ToListAsync()); }
前端对应改动
在搜索表单中新增下拉选择框,name属性设置为searchType即可和输入框内容同步提交:
<select name="searchType"> <option value="title">按标题搜索</option> <option value="id">按电影ID搜索</option> <option value="releaseYear">按上映年份搜索</option> </select>
常见运行失败排查点
- 代码中用到的int类型字段名必须和Movie实体类的属性名完全一致,比如你的年份字段名为
Year就需要替换示例中的ReleaseYear - 不要在
Where查询条件内直接调用int.Parse方法,EF Core无法将该方法翻译为SQL语句,必须提前在查询外完成类型转换 - 类型转换失败时不要传入空值到查询条件,会触发运行时异常
内容的提问来源于stack exchange,提问作者GG6565
相关产品推荐
相关产品推荐

