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

MVC中跨Controller发起Ajax请求的分步实现指导求助

分步解决Ajax调用MVC控制器方法404问题

咱们一步步来搞定这个404的问题,核心是确保请求URL正确、控制器方法配置到位,以及数据能正常传递:

1. 先确认目标控制器方法的配置是否正确

首先检查你的ProductionController里的CreateNewProductionGoal方法,必须满足这几个条件:

  • 加上[HttpPost]特性:因为你的Ajax用的是type: 'post',MVC只会把POST请求路由到带这个特性的方法
  • 方法是public访问级别
  • 参数是ProductionGoalViewModel,确保这个模型的属性名称和你前端传递的data字段一致

示例代码:

using System.Web.Mvc; // ASP.NET Core则用Microsoft.AspNetCore.Mvc

public class ProductionController : Controller
{
    [HttpPost] // 必须加,否则POST请求找不到这个方法
    public JsonResult CreateNewProductionGoal(ProductionGoalViewModel model)
    {
        // 先验证模型是否有效
        if (ModelState.IsValid)
        {
            // 这里写你的业务逻辑:比如保存生产目标到数据库
            // 处理完后返回需要的结果,比如你要用到的ProductionLine ID
            return Json(new { SelectedProductionLine = model.ProductionLineId, Success = true });
        }
        // 如果验证失败,返回错误信息
        return Json(new { Success = false, ErrorMessage = "输入的生产目标数据无效" });
    }
}

2. 生成正确的Ajax请求URL(关键!)

你之前手动写相对路径出错,是因为在Home控制器的视图里,相对路径的基准是当前页面的URL(比如/Home/Index),硬写Production/CreateNewProductionGoal会变成/Home/Production/CreateNewProductionGoal,这显然不对。

正确的做法是用MVC的Url.Action()辅助方法自动生成符合路由规则的URL,这样不管当前在哪个控制器的视图里,都能生成正确的路径。

在你的.cshtml视图里,这样写JavaScript:

// 先用Razor生成正确的目标URL
var targetUrl = '@Url.Action("CreateNewProductionGoal", "Production")';

// 准备要传递的ViewModel数据(根据你的ProductionGoalViewModel属性调整)
var postData = {
    ProductionLineId: $("#ProductionLineId").val(),
    TargetAmount: $("#TargetAmount").val(),
    GoalDeadline: $("#GoalDeadline").val()
};

$.ajax({
    type: 'post',
    url: targetUrl, // 用生成好的URL,避免手动写路径出错
    dataType: "json",
    contentType: "application/json; charset=utf-8", // 告诉服务器我们传递的是JSON格式
    data: JSON.stringify(postData), // 把对象转成JSON字符串,确保Model绑定能正确接收
    success: function (response) {
        if (response.Success) {
            // 成功后执行你的逻辑,比如更新Dashboard视图
            $('#Dashboard').load("/Home/UpdateView/" + response.SelectedProductionLine);
        } else {
            // 处理验证失败的情况,比如提示用户
            alert("创建失败:" + response.ErrorMessage);
        }
    },
    error: function(xhr, status, error) {
        // 加上错误处理,方便调试
        console.log("请求错误详情:");
        console.log("状态码:" + xhr.status);
        console.log("错误信息:" + error);
        console.log("服务器响应:" + xhr.responseText);
    }
});

为什么要加contentType和JSON.stringify?

默认情况下,Ajax会把data以application/x-www-form-urlencoded格式发送,对于复杂的ViewModel对象,这种格式可能导致Model绑定失败。用JSON格式传递数据,能确保前端的字段和后端模型的属性完全匹配,避免绑定错误。

3. 检查路由配置(如果以上步骤还不行)

确认你的MVC路由配置是正确的,默认路由应该能匹配Controller/Action的格式:

  • 对于ASP.NET MVC(传统),在RouteConfig.cs里:
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
  • 对于ASP.NET Core,在Program.cs里:
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

如果你的项目用了自定义路由,要确保Production/CreateNewProductionGoal能匹配到对应的路由规则。

4. 调试排查技巧

如果还是出现404,打开浏览器的开发者工具(按F12),切换到Network标签:

  • 发起Ajax请求后,找到对应的请求项,查看Request URL是不是正确的(比如应该是/Production/CreateNewProductionGoal)
  • 查看Response里的内容,服务器可能会返回详细的错误信息,帮助你定位问题

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:31:46