c# - tutorial - vs 2017 asp net mvc




Come reindirizzare ToAction in ASP.NET MVC senza perdere i dati della richiesta (4)

Utilizzando ASP.NET MVC ci sono situazioni (come l'invio di moduli) che possono richiedere un RedirectToAction .

Una di queste situazioni si verifica quando si verificano errori di convalida dopo l'invio di un modulo e è necessario reindirizzare al modulo, ma si desidera che l'URL rifletta l'URL del modulo, non la pagina dell'azione a cui si invia.

Poiché è necessario che il modulo contenga i dati POST originariamente POST , per comodità dell'utente, nonché a fini di convalida, come posso passare i dati tramite RedirectToAction() ? Se utilizzo il parametro viewData, i miei parametri POST verranno modificati in parametri GET .


C'è un altro modo che evita i tempdata. Il modello che mi piace prevede la creazione di 1 azione sia per il rendering originale che per il rendering nuovamente del modulo non valido. Va qualcosa del genere:

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

Questo è lo schema più o meno. Un piccolo pseudoy. Con questo è possibile creare 1 vista per gestire il rendering del modulo, visualizzare nuovamente i valori (poiché il modulo verrà riempito con i valori precedenti) e mostrare i messaggi di errore.

Quando la pubblicazione in questa azione, se è valida, trasferisce il controllo su un'altra azione.

Sto cercando di semplificare questo modello nel framework di validazione .net mentre sviluppiamo il supporto per MVC.


Dai un'occhiata a MVCContrib , puoi farlo:

using MvcContrib.Filters;

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

Se si desidera passare i dati all'azione reindirizzata, il metodo che è possibile utilizzare è:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);

Tenere presente che TempData memorizza la raccolta di moduli in sessione. Se non ti piace questo comportamento, puoi implementare la nuova interfaccia ITempDataProvider e utilizzare qualche altro meccanismo per archiviare i dati temporanei. Non lo farei se non sapessi per certo (tramite misurazione e profilazione) che l'uso dello stato della sessione ti sta danneggiando.





asp.net-mvc