MVC3 не перенаправляет после поста - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть следующие действия в моем домашнем контроллере. когда я публикую на GetDistance(), он никогда не переходит на страницу / Home / ShowDistance, а остается на странице / Home / Index. Я проверил, что значения lat и lon не являются нулевыми, поэтому браузер должен быть перенаправлен в /Home/ShowDistance.

public ActionResult Index()
{
    return View();
}

[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 RedirectToAction("ShowDistance");
    }
    return RedirectToAction("Index");    
}

public ActionResult ShowDistance()
{
    //...
    return View();
}

Ответы [ 2 ]

8 голосов
/ 13 февраля 2012

В вашем представлении 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>.

0 голосов
/ 13 февраля 2012

Я предполагаю, что либо ваш лат, либо лон не проходят так, как понимает связыватель модели, или вы на самом деле не публикуете в GetDistance (). (как примечание: публикация на что-то под названием Get .. немного странная).

Возможно, если бы вы включили некоторую информацию с вашей точки зрения, это помогло бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...