MVC3在发布后没有重定向

时间:2012-02-13 16:40:43

标签: c# .net asp.net-mvc

我的家庭控制器中有以下操作。当我发布到GetDistance()时,它永远不会进入/ Home / ShowDistance页面,但会保留在/ Home / Index页面上。我已检查latlon值是否为空,因此浏览器应重定向到/ 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 个答案:

答案 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 ..的东西有点奇怪)。

也许如果您从视图中包含一些信息,那将有所帮助。

相关问题