ASP.NET MVC脚手架项目访问Edit、Details、Delete视图返回404错误
问题产生原因
核心问题出在主键Batch_No携带无效尾部空格,与路由/控制器参数匹配逻辑冲突:
- 你给出的请求URL末尾
%20是空格的URL编码,说明Batch_No字段的实际值为带尾部空格的"334609 ",而非纯数字字符串。 - 若脚手架生成的控制器
Edit/Details/Delete动作参数为数值类型(如int id),带空格的字符串无法完成自动类型绑定,路由匹配失败直接返回404。 - 若动作参数为字符串类型,你的数据库
Batch_No字段大概率为定长字符类型(char/nchar),插入数据时不足长度会自动补空格,EF查询时带空格的主键无法匹配到有效数据,脚手架默认动作在查询结果为空时会主动返回HttpNotFound(),触发404。
排查步骤
- 查看
SafetyValveDatasController中GET类型的Edit动作签名,确认参数类型是int还是string。 - 检查模型类
SafetyValveData中Batch_No的属性类型,对应确认数据库表中Batch_No的字段类型是否为定长字符类型。 - 在列表页的循环逻辑中添加调试代码
@item.Batch_No.Length,确认输出的长度是否大于可见数字的长度,验证尾部空格存在。 - 手动修改浏览器地址栏URL,删除末尾的空格字符后访问,确认是否能正常打开页面。
解决方法
临时修复(代码层处理空格)
修改列表页的操作链接逻辑,传递参数前先去除首尾空格:
@Html.ActionLink("Edit", "Edit", new { id=item.Batch_No.Trim() }) | @Html.ActionLink("Details", "Details", new { id=item.Batch_No.Trim() }) | @Html.ActionLink("Delete", "Delete", new { id=item.Batch_No.Trim() })
如果Batch_No为数值类型,可直接转换为数值后传递:
@Html.ActionLink("Edit", "Edit", new { id=Convert.ToInt32(item.Batch_No) })
同时修改控制器的查询逻辑,对传入的ID先做Trim处理再查询:
public ActionResult Edit(string id) { id = id.Trim(); SafetyValveData safetyValveData = db.SafetyValveDatas.Find(id); if (safetyValveData == null) { return HttpNotFound(); } return View(safetyValveData); }
根因修复
将数据库中Batch_No的字段类型从定长字符类型(char/nchar)修改为变长字符类型(varchar/nvarchar),避免插入数据时自动补全空格;同时在新增数据的逻辑中对Batch_No做Trim处理,从源头避免空格产生。
内容的提问来源于stack exchange,提问作者grey717
相关产品推荐
相关产品推荐

