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

голоса
115

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

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

Как я требую формы , чтобы содержать первоначально POSTéd данные, для удобства пользователя, а также цели проверки, как я могу передать данные через RedirectToAction()? Если я использую параметр ViewData, мои POSTпараметры будут изменены на GETпараметры.

Задан 05/08/2008 в 06:33
источник пользователем
На других языках...                            


5 ответов

голоса
76

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

Например:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.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);
}
Ответил 05/08/2008 в 06:43
источник пользователем

голоса
36

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

Ответил 07/08/2008 в 06:12
источник пользователем

голоса
13

Посмотрите на MVCContrib , вы можете сделать это:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Ответил 05/04/2009 в 10:36
источник пользователем

голоса
8

Существует еще один способ, который позволяет избежать 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.

Ответил 25/08/2008 в 23:06
источник пользователем

голоса
2

Если вы хотите передать данные перенаправляются действия, метод, который вы могли бы использовать это:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Ответил 30/11/2013 в 09:39
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more