MVC3在发布后没有重定向

har*_*ers 2 .net c# asp.net-mvc

我的家庭控制器中有以下操作.当我发布到GetDistance()它时,它永远不会进入/ Home/ShowDistance页面,而是停留在/ Home/Index页面上.我已经检查过latlon值不为null,因此浏览器应该重定向到/ 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();
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 8

在您的Index.cshtml视图中,请确保指定要发布到的正确的控制器操作(因为它具有与用于呈现表单的名称不同的名称).所以代替:

@using (Html.BeginForm())
{
    ...
} 
Run Code Online (Sandbox Code Playgroud)

使用:

@using (Html.BeginForm("GetDistance", null))
{
    ...
} 
Run Code Online (Sandbox Code Playgroud)

或者,如果您不使用标准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;
    }
});
Run Code Online (Sandbox Code Playgroud)

您还必须修改GetDistancePOST操作,以便不是重定向而是返回一个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") });
}
Run Code Online (Sandbox Code Playgroud)

显然,这种方式稍微违背了AJAX的目的,因为正如我所说,AJAX的重点是对服务器执行异步请求并保持在同一页面上.所以在这种情况下,您应该坚持使用标准HTML <form>.