Подтвердить что ты не робот

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);
};
4b9b3361

Ответ 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 =>
   ...

После добавления редирект начал работать