MVC3 перенаправляет на действие после вызова ajax

В приложении ASP.NET MVC3 у меня есть кнопка в представлении.

Когда кнопка нажата, вызывается функция и выполняется вызов jquery ajax для сохранения элементов в базе данных

    function SaveMenuItems() {
        var encodeditems = $.toJSON(ids);;
        $.ajax({
            type: 'POST',
            url: '@Url.Action("SaveItems", "Store")',
            data: 'items=' + encodeditems + '&[email protected]',
            complete: function () {
                    }
                }
            });
        }

Я хочу, чтобы после сохранения элементов в базу данных я хочу перенаправить на другой вид. (Перенаправление на действие)

Как я могу это сделать?

Я попытался использовать return RedirectToAction("Stores","Store") в контроллере в конце функции SaveItems. Но он не работает

Я также попытался добавить window.location.replace("/Store/Stores"); в полную функцию вызова ajax, но не работал либо

Любая помощь приветствуется

Спасибо большое

Ответы

Ответ 1

Вы можете использовать javascript для перенаправления на новую страницу. Задайте значение window.location.href для нового URL-адреса в событии ajax success/complete.

var saveUrl = '@Url.Action("SaveItems","Store")';
var newUrl= '@Url.Action("Stores","Store")';

$.ajax({
    type: 'POST',
    url: saveUrl,
    // Some params omitted 
    success: function(res) {
        window.location.href = newUrl;
    },
    error: function() {
        alert('The worst error happened!');
    }
});

Или в событии done

$.ajax({      
    url: someVariableWhichStoresTheValidUrl
}).done(function (r) {
     window.location.href = '@Url.Action("Stores","Store")';
});

В приведенном выше коде используется вспомогательный метод Url.Action для построения правильного относительного URL-адреса для метода действия. Если ваш javascript-код находится внутри внешнего файла javascript, вы должны создать url для корня приложения и передать его вашему script/code внутри внешних js файлов и использовать его для создания URL-адреса для методов действий, как описано в этот пост.

Передача параметров <

Если вы хотите передать некоторые параметры запроса на новый URL-адрес, вы можете использовать эту перегрузку метода Url.Action, который принимает значения маршрута а также для создания URL-адреса с помощью запроса.

var newUrl = '@Url.Action("Stores","Store", new { productId=2, categoryId=5 })';

где 2 и 5 можно заменить некоторыми другими реальными значениями.

Так как это html-помощник, он будет работать только в вашем режиме бритвы, а не во внешних js файлах. Если ваш код находится внутри внешнего js файла, вам нужно вручную создать параметры запроса при запросе url.

Создание нового URL-адреса на стороне сервера

Всегда полезно использовать методы помощника mvc для генерации правильных URL-адресов методу действия. Из вашего метода действий вы можете вернуть json strucutre, у которого есть свойство для перенаправления нового URL.

Для этого вы можете использовать класс UrlHelper внутри контроллера.

[HttpPost]
public ActionResult Step8(CreateUser model)
{
  //to do : Save
   var urlBuilder = new UrlHelper(Request.RequestContext);
   var url = urlBuilder.Action("Stores", "Store");
   return Json(new { status = "success", redirectUrl = url });            
}

Теперь в обратном вызове ajax success/done просто проверьте возвращаемое значение и перенаправьте по мере необходимости.

.done(function(result){
   if(result.status==="success")
   {
      window.location.href=result.redirectUrl;
   }
   else
   {
      // show the error message to user
   }
});

Ответ 2

В действии вы можете написать это:

if(Request.IsAjaxRequest()) {
    return JavaScript("document.location.replace('"+Url.Action("Action", new { ... })+"');");  // (url should be encoded...)
} else {
    return RedirectToAction("Action", new { ... });
}

Ответ 3

Try

window.location = "/Store/Stores";

Вместо.