MVC网站产品筛选时出现“Ressource cannot be found”404错误求助
解决ASP.NET MVC产品筛选的404错误问题
嘿,作为新手遇到这个问题太正常了,咱们一步步拆解解决:
问题根源
你碰到的404错误核心原因是ASP.NET MVC(或ASP.NET Core MVC)的请求逻辑和你想的不一样——你不能直接把表单的action指向视图文件(比如~/Views/Product/Index.cshtml)。因为:
- Views目录默认被服务器保护,不允许直接通过URL访问;
- MVC的请求是通过控制器的动作方法处理的,而非直接访问视图的物理路径。
解决步骤(从0开始)
1. 创建/完善Product控制器
如果还没有,在项目里新建ProductController.cs文件,代码示例如下:
using System.Collections.Generic; using System.Linq; using System.Web.Mvc; // 若是ASP.NET Core,替换为using Microsoft.AspNetCore.Mvc; // 先定义一个基础的Product模型(你可以根据实际需求修改) public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } } public class ProductController : Controller { // 模拟从数据库获取产品数据的方法 private List<Product> GetAllProducts() { return new List<Product> { new Product { Id = 1, Name = "产品A", Category = "option1" }, new Product { Id = 2, Name = "产品B", Category = "option2" }, new Product { Id = 3, Name = "产品C", Category = "option3" } }; } // 处理Product/Index的GET请求,接收category筛选参数 public ActionResult Index(string category) // ASP.NET Core用IActionResult作为返回类型 { // 获取全部产品数据 var products = GetAllProducts(); // 如果用户选择了分类,执行筛选逻辑 if (!string.IsNullOrEmpty(category)) { products = products.Where(p => p.Category == category).ToList(); } // 把筛选后的产品列表传给视图 return View(products); } }
2. 修改表单的提交路径
把表单的action改成指向控制器的Index动作,推荐用Url.Action生成正确路由(这样不管路由配置怎么变都不会出错):
<form action="@Url.Action("Index", "Product")" method="get"> <div class="row"> <div class="row"> <select class="event-type-select" name="category"> <optgroup label="optgroup1"> <option>option1</option> <option>option2</option> </optgroup> <optgroup label="optgroup2"> <option>option3</option> </optgroup> </select> </div> <div class="row"> <button type="submit" id="button" class="btn btn-default">filter!!!</button> </div> </div> </form>
3. 更新视图以显示筛选结果
打开Views/Product/Index.cshtml,改成强类型视图,这样才能接收控制器传递的产品列表:
@model List<Product> <!-- 声明视图的模型类型 --> <h2>产品列表</h2> <!-- 嵌入筛选表单 --> <form action="@Url.Action("Index", "Product")" method="get"> <div class="row"> <div class="row"> <select class="event-type-select" name="category"> <optgroup label="optgroup1"> <!-- 选中当前筛选的分类,提升用户体验 --> <option @(Request.Query["category"] == "option1" ? "selected" : "")>option1</option> <option @(Request.Query["category"] == "option2" ? "selected" : "")>option2</option> </optgroup> <optgroup label="optgroup2"> <option @(Request.Query["category"] == "option3" ? "selected" : "")>option3</option> </optgroup> </select> </div> <div class="row"> <button type="submit" id="button" class="btn btn-default">filter!!!</button> </div> </div> </form> <!-- 展示筛选后的产品 --> <div class="product-list"> @if (Model.Count == 0) { <p>没有找到匹配的产品</p> } else { <ul> @foreach (var product in Model) { <li>@product.Name - 分类:@product.Category</li> } </ul> } </div>
为什么这样能解决问题?
当你点击筛选按钮时,表单会把category参数提交到Product/Index路由,控制器的Index方法接收参数后执行筛选逻辑,再把结果传给视图展示——完全符合MVC"控制器处理逻辑,视图负责展示"的设计思想,自然就不会出现404错误了。
如果是ASP.NET Core项目,代码细节会有小差异(比如命名空间、返回类型),但核心逻辑完全一致,你可以根据项目类型调整。
内容的提问来源于stack exchange,提问作者usernumber
相关产品推荐
相关产品推荐

