Сведения о вопросе

Htmlщик

16:03, 1st July, 2020

Теги

c#   asp.net-mvc    

Как сделать RedirectToAction в ASP.NET MVC без потери данных запроса

Просмотров: 441   Ответов: 5

Использование ASP.NET MVC существуют ситуации (например, подача формы), которые могут потребовать RedirectToAction .

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

Поскольку я требую, чтобы форма содержала исходные данные POST ed, для удобства пользователя, а также для целей проверки, как я могу передать данные через RedirectToAction() ? Если я использую параметр viewData, мои параметры POST будут изменены на параметры GET .



  Сведения об ответе

DINO

18:03, 1st July, 2020

Решение заключается в использовании свойства TempData для хранения необходимых компонентов запроса.

Например:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

Тогда в вашем действии "Form" вы можете пойти:

public ActionResult Form()
{
    /* Declare viewData etc. */

    if (TempData["form"] != null)
    {
        /* Cast TempData["form"] to 
        System.Collections.Specialized.NameValueCollection 
        and use it */
    }

    return View("Form", viewData);
}


  Сведения об ответе

Chhiki

18:03, 1st July, 2020

Имейте в виду, что TempData хранит коллекцию форм в сеансе. Если вам не нравится такое поведение, вы можете реализовать новый интерфейс ITempDataProvider и использовать какой-то другой механизм для хранения временных данных. Я бы не стал этого делать, если бы вы не знали наверняка (через измерение и профилирование), что использование состояния сеанса вредит вам.


  Сведения об ответе

ASER

18:03, 1st July, 2020

Взгляните на MVCContrib , вы можете сделать это:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}


  Сведения об ответе

crush

18:03, 1st July, 2020

Есть еще один способ, который позволяет избежать tempdata. Шаблон, который мне нравится, включает в себя создание 1 действия как для исходного рендеринга, так и для повторного рендеринга недопустимой формы. Это звучит примерно так:

var form = new FooForm();

if (request.UrlReferrer == request.Url)
{
     // Fill form with previous request's data
}

if (Request.IsPost())
{
     if (!form.IsValid)
     {
         ViewData["ValidationErrors"] = ...
     } else {
         // update model
         model.something = foo.something;
         // handoff to post update action
         return RedirectToAction("ModelUpdated", ... etc);
     }
}

// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();

Это более или менее закономерно. Немного pseudoy. С его помощью можно создать 1 представление для обработки визуализации формы, повторного отображения значений (так как форма будет заполнена предыдущими значениями) и отображения сообщений об ошибках.

При учете этого действия, если оно действительно, оно передает управление другому действию.

Я пытаюсь упростить этот шаблон в рамках проверки .net , поскольку мы создаем поддержку для MVC.


  Сведения об ответе

SEEYOU

18:03, 1st July, 2020

Если вы хотите передать данные в перенаправленное действие, можно использовать следующий метод:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться