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

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这种文件路径写法。

其他需要优化的点

  1. Action返回值尽量不用void,返回JsonResult或ActionResult能给前端明确的响应状态,方便调试和处理;
  2. Ajax请求需要正确设置contentType并序列化数据,否则后端可能无法正确接收参数;
  3. 外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:38