Jak RedirectToAction w ASP.NET MVC bez utraty danych żądania

głosy
115

Korzystanie z ASP.NET MVC tam są sytuacje (takich jak przesyłanie formularza), które mogą wymagać RedirectToAction.

Jedną z takich sytuacji jest wtedy, gdy wystąpią błędy sprawdzania poprawności po przedłożeniu formularza i trzeba przekierować z powrotem do formy, ale chciałby, aby odzwierciedlić URL URL postaci, a nie strony działanie to utrzymuje się.

Jak wymagają formy zawierają pierwotnie POSTed danych, dla wygody użytkownika, jak również do celów weryfikacji, w jaki sposób mogę przekazać dane za pośrednictwem RedirectToAction()? Gdybym użyć parametru ViewData, moje POSTparametry zostaną zmienione na GETparametry.

Utwórz 05/08/2008 o 06:33
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
76

Rozwiązaniem jest użycie właściwości TempData do przechowywania pożądanych składników życzenie.

Na przykład:

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

Następnie w „formie” akcji można przejść:

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);
}
Odpowiedział 05/08/2008 o 06:43
źródło użytkownik

głosy
36

Należy pamiętać, że TempData przechowuje kolekcję formularz w sesji. Jeśli ci się nie podoba to zachowanie, można wdrożyć nowy interfejs ITempDataProvider i użyć innego mechanizmu do przechowywania danych tymczasowych. Nie zrobiłby tego, chyba że wiesz na pewno, że (poprzez pomiar i profilowania), że użycie stan sesji rani ciebie.

Odpowiedział 07/08/2008 o 06:12
źródło użytkownik

głosy
13

Spójrz na MvcContrib , można to zrobić:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Odpowiedział 05/04/2009 o 10:36
źródło użytkownik

głosy
8

Jest też inny sposób, który pozwala uniknąć TempData. Wzór I jak wymaga utworzenia 1 działania zarówno przy czyni i ponownie czyni się nieprawidłowym formy. To idzie tak:

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();

To jest wzór bardziej lub mniej. Trochę pseudoy. Dzięki temu można stworzyć 1 Widok obsłużyć renderowania formularza, komunikaty o błędach wielokrotnego wyświetlania wartości (ponieważ formularz zostanie wypełniony poprzednich wartości) i pokazywanie.

Gdy wpis do tej akcji, jeżeli jego ważność przekazuje kontrolę do innego działania.

Staram się, aby ten wzór jest łatwy w ramach walidacji .net jak zbudować poparcie dla MVC.

Odpowiedział 25/08/2008 o 23:06
źródło użytkownik

głosy
2

Jeśli chcesz przekazać dane do działania, które zostało przekształcone, metody można użyć to:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Odpowiedział 30/11/2013 o 09:39
źródło użytkownik

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