无法从js调用控制器方法

时间:2019-03-06 13:05:58

标签: javascript c# asp.net-mvc

[HttpPost]
[Route("mapchanged")]
public ActionResult mapchanged(string latitud, string longitud)
{
  Session["Latitude"] = latitud;
  Session["Longitude"] = longitud;
  return RedirectToAction("search?what=&by=bnm");
}
$.ajax({
  type: "POST",
  async: false,
  url: url, // '@Url.Action("mapchanged")',
  data: {
    latitud: map.getCenter().lat(),
    longitud: map.getCenter().lng()
  },
  dataType: "json",
  contentType: 'application/json; charset=utf-8',
  cache: false,
  success: function(data) {
    alert('Success');
  },
  error: function(err) {
    alert('error = ' + err.status);
  }
});

上面的代码不起作用-它给出错误404。也尝试了var url = '"Home/mapchanged/"',但是它也不起作用。 Ajax代码位于map.js文件中。

2 个答案:

答案 0 :(得分:1)

您对此行动有看法吗?加上它是ajax发布,您在执行ajax发布时无法重定向到其他操作。尝试从该操作返回json,看看它是否有效。

return Json(new { true }, JsonRequestBehavior.AllowGet);

答案 1 :(得分:0)

我试图复制源代码。当前代码存在一些问题。

在RouteConfig类中缺少Route属性的配置,没有此配置,[Route]注释/属性不起作用。

routes.MapMvcAttributeRoutes()

在ajax调用中未使用JSON.stringify进行数据

 var data = {
       latitud: map.getCenter().lat(),
       longitud: map.getCenter().lng()
    };
     $.ajax({
    type: "POST",
    async: false,
    url: '@Url.Action("mapchanged")',
    data: JSON.stringify(data),
    dataType: "json",
    contentType: 'application/json; charset=utf-8',
    cache: false,
    success: function (data) {
        alert('Success');
        window.location.href = data.url;
    },
    error: function (err) {
        alert('error = ' + err.status);
    }
});

您应该返回具有url属性的Json对象,而不是RedirectToAction

[HttpPost]
        [Route("mapchanged")]
        public ActionResult mapchanged(LongLat obj)
        {
            Session["Latitude"] = obj.latitud;
            Session["Longitude"] = obj.longitud;
            //return RedirectToAction("search?what=&by=bnm");
            return Json(new {url = "search?what=&by=bnm"});
        }

        public class LongLat
        {
            public double latitud { get; set; }
            public double longitud { get; set; }
        }