ASP.NET MVC Reindirizza con il modello

Al momento ho un metodo nel mio controller che accetta una raccolta moduli, salva i dati e quindi visualizza i dati in una pagina ‘Dettagli’. Al momento, il codice attualmente è simile al seguente:

[HttpPost] public ActionResult Create(PersonModel person)
{ if (person.IsValid()) { person.additionalData = "Person created successfully"; return View("Details", person); } }

Il problema è che restituendo la vista Dettagli in questo modo mantiene l’URL mysite / Person / Create – idealmente vorrei che l’URL fosse mysite / Person / Details / IdGoesHere.

Sono sicuro che questo deve essere ansible. Ovviamente, potrei usare Response.Redirect, tuttavia questo non mi consente di passare il modello alla vista. Per quanto posso dire, non posso passare il modello usando RedirectToAction?

Grazie per l’aiuto.

MODIFICA: per confermare – il modello prodotto dall’azione Crea è diverso da quello predefinito creato dall’azione Dettagli. Pertanto, eseguendo un reindirizzamento diretto su Azione e passando l’Id non funziona poiché il modello prodotto non è corretto. Per dare più contesto, il modello dall’azione Crea contiene un valore aggiuntivo che dice “Persona creata con successo”, se reindirizzamento all’azione Dettagli, questo messaggio non è presente nel modello.

Direttamente dalla mia app:

 public ActionResult Create(Booking item) { if (ModelState.IsValid) { int newID = _tasks.Create(item); // NEW section to emulate model being populated for use in Details view TempData["additionalData"] = "Person created successfully"; return RedirectToAction("Details", new { id = newID }); } else { return View(); } } 

quindi, la tua azione “Dettagli” non potrebbe essere così:

 public ActionResult Details(int id) { var item = _tasks.GetByKey(id); var additionalData = TempData["additionalData"]; if(item != null) { if(additonalMessage!=null) { item.additionalData = additionalData; } return View(item); } else return View("Notfound"); } 

non potresti adottare un approccio simile ??

Si può semplicemente fare il reindirizzamento come da convenzione e avere un flag impostato (su tempdata come sopra) che dà questo messaggio? Il flag tempadata verrà impostato SOLO all’interno dell’azione Create, pertanto verrebbe eseguito solo su Creazione di un nuovo object ‘persona’. quindi l’azione Dettagli lo mostrerebbe solo come conseguenza dell’azione Crea

È ansible integrare ciò che è stato offerto (utilizzare RedirectToAction e routing) con l’uso di TempData

 [HttpPost] public virtual ActionResult Create(IEnumerable orderItems) { if (orderItems.Count() == 0) { return RedirectToAction("NoOrderItems"); } else { TempData["orderItems"] = orderItems; return RedirectToAction("Confirm"); } } [HttpGet] public virtual ActionResult Confirm() { var orderItems = TempData["orderItems"] as IEnumerable; if (orderItems == null || orderItems.Count() == 0) { this.InvokeHttp404(ControllerContext.HttpContext); } return View(orderItems); } 

Lo uso per gli articoli che potrei non voler creare di nuovo sulle richieste successive o persistere ancora nel database ancora. Con questo, non ho bisogno di controlli nulli nella mia vista, in quanto la pagina di conferma può essere “ottenuta” solo se ci sono dati per essa.

Questo dovrebbe portarti al Modello Dettagli, passandogli l’ID.

 return RedirectToAction("Details", new { id = person.PersonID }); 

Tenete presente che potete anche adottare l’approccio sicuro al tipo di MvcContrib e farlo

 return this.RedirectToAction(c => c.Details(person.PersonID));