Domanda

Quando chiami RedirectToAction all'interno di un controller, reindirizza automaticamente usando un HTTP GET. Come faccio a dirlo esplicitamente di utilizzare un POST HTTP?

Ho un'azione che accetta richieste GET e POST e voglio essere in grado di RedirectToAction utilizzando POST e inviargli alcuni valori.

In questo modo:

this.RedirectToAction(
    "actionname",
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);

Voglio che i valori someValue e anotherValue vengano inviati utilizzando un HTTP POST anziché un GET. Qualcuno sa come farlo?

È stato utile?

Soluzione

HTTP non supporta il reindirizzamento a una pagina utilizzando POST. Quando reindirizzi da qualche parte, l'HTTP " Location " header indica al browser dove andare e il browser invia una richiesta GET per quella pagina. Probabilmente dovrai semplicemente scrivere il codice per la tua pagina per accettare richieste GET e richieste POST.

Altri suggerimenti

Per il tuo esempio particolare, farei solo questo, dal momento che ovviamente non ti importa davvero che il browser ottenga comunque il reindirizzamento (in virtù dell'accettazione della risposta che hai già accettato):

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
   // obviously these values might come from somewhere non-trivial
   return Index(2, "text");
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int someValue, string anotherValue) {
   // would probably do something non-trivial here with the param values
   return View();
}

Funziona facilmente e non ci sono affari divertenti in corso - questo ti consente di mantenere il fatto che il secondo accetta davvero solo le richieste HTTP POST (tranne in questo caso, che è comunque sotto il tuo controllo) e non Non devo nemmeno usare TempData, che è ciò che suggerisce il link che hai pubblicato nella tua risposta.

Mi piacerebbe sapere cosa è " sbagliato " con questo, se c'è qualcosa. Ovviamente, se vuoi davvero aver inviato al browser un reindirizzamento, questo non funzionerà, ma dovresti chiederti perché dovresti provare a convertirlo indipendentemente, dal momento che mi sembra strano.

Spero che sia d'aiuto.

Se si desidera passare i dati tra due azioni durante un reindirizzamento senza includere dati nella stringa di query, inserire il modello nell'oggetto TempData.

AZIONE

TempData [" datacontainer "] = modelData;

Visualizza

var modelData= TempData["datacontainer"] as ModelDataType; 

TempData è pensato per essere un'istanza di breve durata e dovresti usarla solo durante le richieste correnti e successive! Poiché TempData funziona in questo modo, è necessario sapere con certezza quale sarà la richiesta successiva e il reindirizzamento a un'altra vista è l'unica volta che è possibile garantirlo.

Pertanto, l'unico scenario in cui l'utilizzo di TempData funzionerà in modo affidabile è il reindirizzamento.

prova questo

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>");

Vorrei espandere la risposta di Jason Bunting

come questo

ActionResult action = new SampelController().Index(2, "text");
return action;

Ed Eli sarà qui per avere un'idea su come renderla variabile generica

Può ottenere tutti i tipi di controller

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top