Ajax调用C#控制器方法遇404错误:URL及控制器问题排查
解决ASP.NET MVC Ajax调用404错误的问题
我来帮你梳理一下问题所在,你遇到的404错误主要是几个关键细节没处理对,咱们一步步来解决:
核心错误1:控制器Action是静态方法
ASP.NET MVC的Action方法必须是实例方法,不能用static修饰。因为MVC框架需要通过控制器实例来处理请求上下文、路由信息等,静态方法无法获取这些必要的上下文,框架根本识别不了这是一个有效的Action。
核心错误2:URL写法不符合MVC路由规则
MVC是基于路由匹配的,不是直接指向物理文件路径。你的默认路由规则是{controller}/{action}/{id},这里的controller是控制器名称(要去掉Controller后缀),action是方法名。所以正确的URL应该是/Home/AddProject,而不是Controllers/HomeController/AddProject这种文件路径写法。
其他需要优化的点
- Action返回值尽量不用
void,返回JsonResult或ActionResult能给前端明确的响应状态,方便调试和处理; - Ajax请求需要正确设置
contentType并序列化数据,否则后端可能无法正确接收参数; - 外部JS文件里不能直接用Razor的
Url.Action语法,因为Razor只会解析视图文件,外部JS不会被服务器解析。
第一步:修改控制器Action方法
把static修饰符去掉,改成实例方法,并返回JsonResult:
public partial class HomeController : Controller { [HttpPost] public JsonResult AddProject(string ProjectName) { try { using (AutomationMethodDirectoryEntities db = new AutomationMethodDirectoryEntities()) { PROJECT project = new PROJECT(); project.ProjectName = ProjectName; db.PROJECTS.Add(project); db.SaveChanges(); } // 返回成功状态 return Json(new { success = true }); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); // 返回失败状态和错误信息 return Json(new { success = false, error = ex.Message }); } } }
另外要确保你的分部类Adders.cs和HomeController主类在同一个命名空间下(比如都是RTCAD),否则编译器无法合并这两个分部类,框架还是找不到这个Action。
第二步:修改Ajax请求代码
调整URL、设置正确的contentType并序列化数据:
document.getElementById('submit-new-project').addEventListener("click", function () { var ProjectName = document.getElementById('new-project').value; if (ProjectName) { $.ajax({ type: "POST", url: "/Home/AddProject", // 符合路由规则的URL contentType: "application/json; charset=utf-8", // 指定JSON格式 data: JSON.stringify({"ProjectName": ProjectName}), // 序列化数据 success: function (response) { if (response.success) { hideElement("add-button-popup"); location.reload(); } else { alert("添加项目失败: " + response.error); } }, error: function (errorThrown) { console.log(errorThrown); } }); } else { alert("Text Field Must Not Be Empty"); } });
(可选)更可靠的URL写法
如果你的项目部署在虚拟目录下,硬写/Home/AddProject可能出问题,可以在Razor视图里先把URL存到全局变量,再在外部JS里使用:
<!-- 在你的视图页面里添加这段代码,放在引入外部JS之前 --> <script> window.addProjectUrl = '@Url.Action("AddProject", "Home")'; </script> <script src="~/JS/data handling.js"></script>
然后在JS里把url改成window.addProjectUrl即可。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

