RedirectToAction не меняет URL или не переходит к представлению индекса
Я попытался использовать RedirectToAction
после того, как сделал сообщение для контроллера и сохранил, но URL-адрес не изменился, и перенаправление не работает. Мне нужно добавить, что редирект вводит метод действия контроллера при отладке. Он не меняет 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);
};
Ответы
Ответ 1
Код, который вы показываете, верен. Моя дикая догадка заключается в том, что вы не выполняете стандартную POST (например, перенаправления не работают с AJAX-сообщением).
Браузер будет игнорировать ответ перенаправления на POST AJAX. Вам нужно перенаправить в script, если вам нужно перенаправить, когда вызов AJAX возвращает ответ перенаправления.
Ответ 2
Вам нужно добавить "return false"; до конца вашего события onclick javascript. Например:
Код бритвы
@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();
});
});
С#
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
return RedirectToAction("Index");
}
Ответ 3
Я только что наткнулся на эту проблему, и для меня ничего не работало. Оказалось, что контроллер я перенаправлял требуемую авторизацию - атрибут [Authorize]
предотвращал перенаправление.
[Authorize]//comment this out
public class HomeController : Controller {...}
В дороге или в больших проектах это может быть не исправление, но если вы ищете простое перенаправление или запуск, это может быть для вас решением.
Ответ 4
Проверьте с помощью firebug. Сообщение может возвращать ошибку сервера.
Ответ 5
Попробуйте выполнить следующее:
верните свое действие:
return Json(Url.Action("Index", "Home"));
и в вашем ajax:
window.location.href
Ответ 6
Это немного поздно.... но у меня была такая же проблема в MVC5. У меня было 2 действия с тем же именем, что достаточно распространено. Я не получал ошибок, которые мог бы захватить в 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});
}
Ответ 7
Я решил написать этот комментарий как новый ответ, потому что я думаю, что ему нужно больше описания, и, возможно, кто-то не сможет увидеть его в комментариях, если у меня возникнут проблемы. Поэтому я прошу прощения, если вы думаете, что это не ответ и должно быть написано в разделе комментариев.
В некоторых случаях я использовал RedirectToAction, чтобы отправить пользователя другому действию, если введенные значения неверны или недостаточны, и избегать продолжения текущего процесса, как показано ниже:
if (inputValues == null)
{
RedirectToAction("index");
}
Это не работает и продолжает текущий процесс, чтобы принять необработанную ошибку. Я ищу и читаю некоторые статьи, но не могу найти решение. Вызов RedirectToAction не из кода Ajax, и маршрутизация настолько проста даже без каких-либо параметров. Так почему не работает? Наконец, я обнаружил простую ошибку: забыл поставить ключевое слово return перед RedirectToAction. Я изменил код, как показано ниже:
if (inputValues == null)
{
return RedirectToAction("index");
}
И это сработало. Надеюсь, это поможет.
Ответ 8
Я только столкнулся с этой проблемой, и ничто не работало для меня. Оказалось, что контроллер, который я перенаправлял на требуемую авторизацию - атрибут [Authorize] предотвращал любое перенаправление
[Authorize]//comment this out
public class HomeController : Controller {...}
Потому что я забыл добавить app.UseAuthentication() в блок кода в Startup.cs.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
...
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
...
После добавления редирект начал работать