Jak RedirectToAction v ASP.NET MVC bez ztráty požadovat data

hlasů
115

Pomocí ASP.NET MVC existují situace (například odeslání formuláře), které mohou vyžadovat RedirectToAction.

Jedna taková situace je, když narazíte na chyby ověření po odeslání formuláře a musí přesměrovávat zpět do formy, ale chtěli URL tak, aby odrážely URL formuláře, nikoli akce strana předkládá se.

Jak jsem již vyžadují formu, aby obsahoval původně POSTed data pro uživatelský komfort, stejně jako účely ověření, jak mohu předat data přes RedirectToAction()? Mám-li použít parametr viewData, moji POSTbudou parametry měnit, aby GETparametry.

Položena 05/08/2008 v 06:33
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
76

Řešením je použít vlastnost TempData k ukládání požadovaných komponent požadavek.

Například:

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

Pak se ve vašem „Form“ akci můžete jít:

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);
}
Odpovězeno 05/08/2008 v 06:43
zdroj uživatelem

hlasů
36

Mějte na paměti, že TempData ukládá kolekci formuláře v relaci. Pokud se vám nelíbí, že chování, můžete implementovat nové ITempDataProvider rozhraní a použít nějaký jiný mechanismus pro ukládání dat temp. Já bych to dělat, pokud víte o tom, (přes měření a profilování), že použití stavu relace vás bolí.

Odpovězeno 07/08/2008 v 06:12
zdroj uživatelem

hlasů
13

Podívejte se na MVCContrib , můžete to udělat:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Odpovězeno 05/04/2009 v 10:36
zdroj uživatelem

hlasů
8

Existuje jiný způsob, který se vyhýbá tempdata. Vzor se mi líbí zahrnuje vytvoření 1 žalobu na obě původní omítky a re-render neplatné formy. Jde to nějak takhle:

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 je vzor více či méně. Trochu pseudoy. Díky tomu můžete vytvářet 1 pohled zvládnout vykreslování formuláře, re-zobrazení hodnot (protože tvar bude vyplněn s předchozími hodnotami), a zobrazující chybové zprávy.

Je-li odeslání do této akce, je-li její platné přenáší kontrolu nad jinému působení.

Snažím se, aby tento model snadno v rámci validace .net jak stavíme out podporu MVC.

Odpovězeno 25/08/2008 v 23:06
zdroj uživatelem

hlasů
2

Chcete-li přenést data do přesměrované akci, metoda, kterou by mohl použít, je:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Odpovězeno 30/11/2013 v 09:39
zdroj uživatelem

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