RedirectToAction不更改URL或导航到索引视图

时间:2010-02-08 21:35:43

标签: asp.net-mvc

我在向控制器发送帖子并保存后尝试使用RedirectToAction,但URL没有更改,重定向似乎不起作用。我需要补充一点,重定向确实在我调试时进入控制器动作方法。它不会更改网址或导航到Index视图。

public ViewResult Index()
{
    return View("Index", new TrainingViewModel());
}

public ActionResult Edit()
{
    // save the details and return to list
    return RedirectToAction("Index");    
}

我做错了什么?

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.js/{*pathInfo}");
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = "" } // Parameter defaults
    );
}

jQuery调用:

this.SynchValuesToReadOnly = function() {
    window.location = $('#siteRoot').attr('href') + 'Sites/';           
};

this.OnSiteEdit = function() {
    // post back to the server and update the assessment details    
    var options = {
        target: '',
        type: 'post',
        url: '/Site/Edit',
        beforeSubmit: othis.validate,
        success: othis.SynchValuesToReadOnly
    };

    $('#uxSiteForm').ajaxSubmit(options);
};

8 个答案:

答案 0 :(得分:72)

您显示的代码是正确的。我的猜测是你没有做标准的POST(例如,重定向不能用于AJAX帖子)。

浏览器将忽略对AJAX POST的重定向响应。如果您需要在AJAX调用返回重定向响应时重定向,则由您在脚本中重定向。

答案 1 :(得分:7)

你需要添加“return false;”结束你的onclick javascript事件。例如:

Razor Code

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.ID) 
    @Html.ActionLink("Save", "SaveAction", "MainController", null, new { @class = "saveButton", onclick = "return false;" })
}

JQuery代码

$(document).ready(function () {
        $('.saveButton').click(function () {
            $(this).closest('form')[0].submit();
        });
    });

C#

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
    return RedirectToAction("Index");
}

答案 2 :(得分:5)

我刚刚遇到这个问题,没有什么对我有用。事实证明我正在重定向到所需授权的控制器 - [Authorize]属性阻止了任何重定向。

[Authorize]//comment this out
public class HomeController : Controller {...}

在路上或在较大的项目中,这可能不是理想的修复,但如果您只是寻找简单的重定向或开始,这可能是您的解决方案。

答案 3 :(得分:3)

用萤火虫检查。 Post可能会返回服务器错误。

答案 4 :(得分:2)

尝试如下:

返回你的行动:

return Json(Url.Action("Index", "Home"));

并在你的ajax中:

window.location.href

答案 5 :(得分:2)

这有点晚了......但我在MVC5中遇到了同样的问题。我有两个同名的动作,这很常见。我没有得到任何我可以在控制器中的Application_Error或OnException中捕获的错误。我尝试在RedirectToAction路由变量中添加动作,控制器,区域无效。我最终将POST操作重命名为EditPost,现在一切都适合我。希望这会有所帮助。

public ActionResult Edit(int id)
{
    return View();
}

[HttpPost, ValidateAntiForgeryToken]
public ActionResult Edit(MyInputModel myInputModel)
{
    return View();
}

public ActionResult Create()
{
    return RedirectToAction("Edit", new {id = 1});
}

答案 6 :(得分:0)

我决定将此评论写为新答案,因为我认为它需要更多描述,并且如果遇到问题,可能无法在评论中看到它。因此,如果您认为这不是答案,必须在评论部分写上歉意。

在某些情况下,如果输入值不正确或不足,我会使用RedirectToAction将用户发送到另一个操作,并避免继续执行以下当前过程:

if (inputValues == null)
{
  RedirectToAction("index");
}

这将继续不起作用,并继续当前过程以处理未处理的错误。我搜索并阅读了一些文章,但找不到解决方案。并不是从Ajax代码中调用RedirectToAction,并且路由非常简单,甚至没有任何参数。那么为什么不起作用呢?最后,我发现了一个简单的错误:忘记将“ return” 关键字放在RedirectToAction之前。我将代码更改如下:

if (inputValues == null)
{
  return RedirectToAction("index");
}

这是可行的。希望有帮助。

答案 7 :(得分:0)

我刚遇到这个问题,对我来说没有任何帮助。原来我要重定向到所需授权的控制器-[Authorize]属性阻止任何重定向

this.setState({
  houseId: this.props.match.params.houseId
})

因为我忘记将app.UseAuthentication()添加到Startup.cs的代码块中。

   [Authorize]//comment this out
   public class HomeController : Controller {...}

添加重定向后开始起作用