Как я могу заставить MVC POST вернуть меня на предыдущую страницу? - PullRequest
4 голосов
/ 02 ноября 2011

У меня есть следующее действие, которое вызывается с экрана со списком записей.

    [HttpPost]
    //[Authorize(Roles = "admin")]
    public ActionResult Edit(EditViewModel itemView)
    {

После завершения действия я хотел бы вернуться на страницу, с которой было вызвано действие.Однако я не хочу обновлять эту страницу.Я просто хочу вернуться к заполненному экрану, используя что-то похожее на кнопку «Назад» в браузере.Прямо сейчас, когда я нажимаю «сохранить», мое действие выполняет следующее, что я не хочу:

return RedirectToAction("Index");

Есть ли способ перенаправить на предыдущую страницу с MVC3?

Что-то вродеФункциональность Stackoverflow после нажатия кнопки «Изменить» для редактирования ответа, когда он возвращается к сообщению.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Вместо перенаправления,

[HttpGet]
public ActionResult Index()
{
    /// preform any processing necessary for your index page on GET
    return View("Index");
}

[HttpPost]
public ActionResuit Edit(EditViewModel itemView)
{
  if (ModelState.IsValid)
  {
    /// do whatever you want with your model...
  }

  // return the contents as they'd be rendered by the Index action
  return Index(); 
}

Обратите внимание, что при использовании этого метода URL-адрес в браузере будет по-прежнему отображать URL-адрес редактирования (например, /area_name/edit), но это можно исправить следующим образом:

  1. Использование перенаправления (которое, как вы сказали, не хотите делать)
  2. Использование JavaScript для обновления URL-адреса или использование history.back() в соответствии с предложением @AlanStephens
  3. Вероятно, другие методы, которые не сразу приходят на ум.

Однако я бы усомнился, действительно ли это лучший подход.Как правило, пользователи ожидают, что разные URL будут выполнять разные действия.

Или, если я вас правильно понимаю, и действие редактирования вызывается со страницы индекса,

[HttpGet]
public ActionResult Index()
{
  return View();
}

[HttpPost] /// from a form on Index
public ActionResult Index(EditViewModel model)
{
  if (ModelState.IsValid)
  {
    ////
  }
  return View();
}

и просто берите /Edit полностью вне игры.Опять же, мне не очень важен такой подход.

1 голос
/ 02 ноября 2011

Исходя из кода, который вы дали, похоже, что у вас есть экран с нумерацией страниц, с возможностью щелкнуть по редактированию в каждой строке. Вот как я решил эту проблему в прошлом.

На странице «Индекс» при загрузке страницы, будь то из основного индекса или метода подкачки, добавьте следующее:

Session["CurrentUrl"] = Request.Url.ToString();

Итак, теперь, в конце метода POST для вашей страницы редактирования, выполните:

return Session["CurrentUrl"] == null ?
    Index() :
    Redirect(Session["CurrentUrl"]);
0 голосов
/ 05 апреля 2017

То, что вы описали, легко достигается с помощью вызовов ajax.Таким образом, вы выполняете любое действие, которое вам нравится, и после этого (при успешном ответе) вы можете легко переходить с текущей страницы, используя javascript.

Если вы отправляете POST на страницу и в ответ вы возвращаете то же представление, которое получилис помощью запроса GET (страница индекса) некоторые пользователи могут нажать F5, чтобы перезагрузить эту страницу индекса и получить предупреждение в браузере, которое фактически говорит, что оно снова отправит запрос POST.Это довольно запутанно для пользователей и не очень удобно для пользователя (не говоря уже о многочисленных проблемах, связанных с его идеальностью).

Хотя вам не нравится подход перенаправления, я думаю, из-за дополнительного ответаЯ должен сказать, что в MVC это правильный способ сделать это, предполагая, что вы не хотите использовать вызовы ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...