Vra

Die gebruik van ASP.NET MVC daar situasies (soos vorm voorlegging) dat 'n RedirectToAction mag vereis.

Een so 'n situasie is wanneer jy validasiefoute teëkom nadat 'n vorm voorlegging en moet terug na die vorm herlei, maar wil graag die URL na die URL van die vorm weerspieël, nie die aksie bladsy dit voorlê aan.

As ek die vorm vereis dat die oorspronklik POSTed data, vir gebruikers gemak, sowel as bevestiging doeleindes bevat, hoe kan ek slaag die data deur die RedirectToAction()? As ek die parameter viewData gebruik, sal my POST parameters verander na GET parameters.

Was dit nuttig?

Oplossing

Die oplossing is om die eiendom TempData gebruik om die verlangde komponente Versoek stoor.

Byvoorbeeld:

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

Toe ek in jou "Form" aksie wat jy kan gaan:

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

Ander wenke

Hou in gedagte dat TempData slaan die vorm versameling in sessie. As jy nie daarvan hou dat gedrag, kan jy die nuwe ITempDataProvider koppelvlak implementeer en gebruik 'n ander meganisme vir die berging van tydelike data. Ek sou dit nie doen nie, tensy jy weet vir 'n feit (via meting en profilering) dat die gebruik van Sessie staat is seer jou.

Neem 'n blik op MVCContrib , kan jy dit doen:

using MvcContrib.Filters;

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

Daar is nog 'n manier waarop tempdata vermy. Die patroon wat ek graag behels die skep van 1 aksie vir beide die oorspronklike lewer en weer te lewer van die ongeldig vorm. Dit gaan iets soos hierdie:

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

Dit is die patroon min of meer. 'N bietjie pseudoy. Met dit wat jy kan 1 oog om te hanteer die lewering van die skep van die vorm, re-vertoning van die waardes (sedert die vorm gevul sal word met die vorige waardes), en wat fout boodskappe.

Wanneer die plasing aan hierdie aksie, as sy geldig dit beheer oordra na 'n ander aksie.

Ek probeer om hierdie patroon maklik in die NET validering raamwerk maak as ons bou uit ondersteuning vir MVC.

As jy wil data te slaag om die herlei aksie, die metode wat jy kan gebruik is:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top