В вашем представлении Index.cshtml
убедитесь, что вы указали правильное действие контроллера для публикации (поскольку оно имеет имя, отличное от имени, используемого для отображения формы). Так что вместо:
@using (Html.BeginForm())
{
...
}
использование:
@using (Html.BeginForm("GetDistance", null))
{
...
}
Или, если вы не используете стандартный HTML <form>
для вызова действия GetDistance
, а вызов AJAX, то вполне нормально, что URL браузера остается на /Home/Index
. Весь смысл AJAX состоит в том, чтобы выполнять асинхронный HTTP-запрос к серверу, не отходя от текущей страницы (в вашем случае это /Home/Index
). Если это так, и вы хотите перенаправить, вам придется сделать это на клиенте в обратном вызове успеха:
$.ajax({
url: '@Url.Action("GetDistance")',
type: 'POST',
data: { lat: '123', lon: '456' },
success: function(result) {
window.location.href = result.redirectTo;
}
});
Вам также придется изменить действие GetDistance
POST, чтобы вместо перенаправления оно возвращало объект JSON, содержащий целевой URL-адрес для перенаправления, который можно использовать в обратном вызове успеха:
[HttpPost]
public ActionResult GetDistance(string lat, string lon)
{
if (lat != null && lon != null)
{
Session["latlon"] = new LatLon { Latitude = double.Parse(lat), Longitude = double.Parse(lon) };
return Json(new { redirectTo = Url.Action("ShowDistance") });
}
return Json(new { redirectTo = Url.Action("Index") });
}
Очевидно, что этот вид немного противоречит цели AJAX, потому что, как я уже сказал, весь смысл AJAX состоит в том, чтобы выполнять асинхронные запросы к серверу и оставаться на той же странице. Так что в этом случае вам следует придерживаться стандартного HTML <form>
.