MVC项目中ActionLink触发HTTP 404错误求助
兄弟,MVC里遇到404真的挺闹心的,我帮你梳理几个最常见的排查方向,一个个试应该能找到问题:
先确认控制器和Action方法的基础存在性
你提到已经创建了SiteRegistrationController,那一定要确保里面有public的CreateSiteAction方法,而且默认是GET请求(如果没加[HttpPost]的话)。比如控制器里的代码得是这样的:public class SiteRegistrationController : Controller { SiteInfoManager manager = new SiteInfoManager(); // 必须是public,且默认支持GET请求 public ActionResult CreateSite() { // 你的逻辑代码 return View(); } }如果这个方法是
private或者加了[HttpPost],那ActionLink发起的GET请求肯定会404。检查ActionLink的参数顺序是否正确
你写的ActionLink代码是:<li> @Html.ActionLink("Create Location","CreateSite", "SiteRegistration", routeValues: null, htmlAttributes: new { id = "registerLink" }) </li>参数顺序是对的(链接文本→Action名→控制器名→路由参数→HTML属性),这里控制器名写
SiteRegistration是对的,不需要加Controller后缀,这点没问题。不过可以右键查看页面源代码,看看生成的<a>标签的href属性是什么,比如是不是/SiteRegistration/CreateSite,然后手动在浏览器地址栏输入这个URL试试:- 如果手动输入也404,那问题出在后端路由或控制器上;
- 如果手动输入能访问,那可能是页面渲染时的其他问题(比如JS干扰?不过概率很低)。
排查路由配置是否正常
打开RouteConfig.cs(如果是MVC 5及之前)或者Program.cs/Startup.cs(MVC Core),看看默认路由是否正确配置。比如MVC 5的默认路由应该是这样的:routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );如果你的项目有自定义路由,或者给
SiteRegistrationController配置了特殊路由规则,可能会导致CreateSite无法被匹配到。另外,如果项目使用了区域(Area),那ActionLink需要指定area路由参数,比如:@Html.ActionLink("Create Location","CreateSite", "SiteRegistration", new { area = "YourAreaName" }, new { id = "registerLink" })检查命名空间约束问题
如果你的解决方案里有多个项目,或者控制器在特定的命名空间下,路由配置里可能加了命名空间约束,导致MVC找不到你的SiteRegistrationController。比如RouteConfig里的MapRoute如果指定了namespaces参数,要确保你的控制器所在的命名空间包含在里面。其他可能的小坑
- 有没有给控制器加了
[Route]属性进行属性路由?如果用了属性路由,那默认的约定路由可能不生效,需要确保CreateSite方法上的路由模板能匹配到请求; - 检查IIS或者开发服务器的配置,有没有把项目的根目录设置正确,导致URL路径前缀不对;
- 清理项目的bin和obj文件夹,重新编译运行,有时候编译缓存也会导致奇怪的问题。
- 有没有给控制器加了
你可以按照上面的步骤一步步排查,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者user5843610

