我的家庭控制器中有以下操作。当我发布到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();
}
答案 0 :(得分:8)
在Index.cshtml
视图中,请确保指定要发布到的正确控制器操作(因为它的名称与用于呈现表单的名称不同)。所以而不是:
@using (Html.BeginForm())
{
...
}
使用:
@using (Html.BeginForm("GetDistance", null))
{
...
}
或者,如果您不使用标准HTML <form>
来调用GetDistance
操作,而是使用AJAX调用,那么浏览器网址保持在/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>
。
答案 1 :(得分:0)
我猜你的lat和lon没有以模型绑定器理解的方式通过,或者你实际上没有发布到GetDistance()。 (作为附注,张贴到名为Get ..的东西有点奇怪)。
也许如果您从视图中包含一些信息,那将有所帮助。