Hoe om RedirectToAction in ASP.NET MVC sonder om versoek data
-
08-06-2019 - |
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 POST
ed 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.
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);