使用jQuery Ajax调用类库中控制器时出错,附相关代码
咱们一步步来拆解你遇到的问题,从代码里能看到几个关键的错误点,逐个解决就能搞定:
1. 路由配置冲突 + 属性路由未启用
你现在的路由配置里有两个模板完全一样的路由:{controller}/{action}/{id},而且Default路由在前面。MVC路由是按顺序匹配的,所有请求都会先命中Default路由,后面的Business路由根本不会被触发。另外,你控制器上用了[Route]属性,但没有在路由配置里启用属性路由,导致这个注解根本不起作用。
解决方法:
修改RouteConfig.cs,先启用属性路由,然后删除重复的Business路由:
// 先启用属性路由,这行要放在MapRoute之前 routes.MapMvcAttributeRoutes(); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
如果你的控制器在另一个类库中,还要确保MVC能找到它,给默认路由加上命名空间:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 替换成你的类库控制器所在的命名空间 namespaces: new[] { "YourClassLibrary.Controllers" } );
2. 返回JSON的方式错误
你控制器里返回的是一个JSON格式的字符串,然后用Json(myresult, JsonRequestBehavior.AllowGet)包装,这会导致MVC把这个字符串再转义成JSON字符串。比如前端拿到的会是"{'name':'John', 'age':31, 'city':'New York' }",而不是预期的JSON对象,这会触发dataType: 'json'的解析错误,进入error回调。
解决方法:
直接返回匿名对象或模型,让MVC自动序列化正确的JSON:
[HttpGet] [Route("Business/GetCountries")] public JsonResult GetCountries(string countryName) { // 直接用匿名对象,MVC会自动转成正确的JSON var myresult = new { name = "John", age = 31, city = "New York" }; return Json(myresult, JsonRequestBehavior.AllowGet); }
3. Ajax请求的优化(可选但更规范)
你的Ajax请求里async: false会阻塞浏览器,影响用户体验,建议改成async: true。另外,明确传递参数(即使是空值),方便后续扩展,同时在error回调里打印responseText,能更直观看到后端返回的错误信息:
baseUrl = "/Business/GetCountries"; function getCountries() { var obj = {}; obj.countryName = ''; $.ajax({ type: 'GET', url: baseUrl, dataType: 'json', async: true, // 改成异步,避免阻塞浏览器 data: obj, // 明确传递参数 success: function (data) { console.log(data); }, error: function (err) { // 打印错误详情,方便排查 console.log("错误信息:", err.responseText); } }); }
按照上面的步骤调整后,应该就能正常调用到类库中的控制器并拿到正确的JSON数据了。
内容的提问来源于stack exchange,提问作者user8718405

