我在向控制器发送帖子并保存后尝试使用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);
};
答案 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 {...}
添加重定向后开始起作用