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

ASP.NET MVC脚手架项目访问Edit、Details、Delete视图返回404错误

问题产生原因

核心问题出在主键Batch_No携带无效尾部空格,与路由/控制器参数匹配逻辑冲突:

  1. 你给出的请求URL末尾%20是空格的URL编码,说明Batch_No字段的实际值为带尾部空格的"334609 ",而非纯数字字符串。
  2. 若脚手架生成的控制器Edit/Details/Delete动作参数为数值类型(如int id),带空格的字符串无法完成自动类型绑定,路由匹配失败直接返回404。
  3. 若动作参数为字符串类型,你的数据库Batch_No字段大概率为定长字符类型(char/nchar),插入数据时不足长度会自动补空格,EF查询时带空格的主键无法匹配到有效数据,脚手架默认动作在查询结果为空时会主动返回HttpNotFound(),触发404。
排查步骤
  1. 查看SafetyValveDatasController中GET类型的Edit动作签名,确认参数类型是int还是string。
  2. 检查模型类SafetyValveData中Batch_No的属性类型,对应确认数据库表中Batch_No的字段类型是否为定长字符类型。
  3. 在列表页的循环逻辑中添加调试代码@item.Batch_No.Length,确认输出的长度是否大于可见数字的长度,验证尾部空格存在。
  4. 手动修改浏览器地址栏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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:02