2009-06-04 8 views
5

Sto visualizzando un elenco di articoli per un determinato ordine. Quando un utente fa clic su Aggiungi elemento, reindirizzo alla pagina Articolo/Crea. Questa pagina raccoglie quell'input necessario, ma deve anche conoscere l'ID ordine a cui appartiene l'elemento. Qual è il modo appropriato per passare l'OrderID all'elemento/Crea in modo che sopravviva al post del modulo quando viene salvato l'elemento appena creato.ASP.NET MVC Crea su una relazione dettagli principale

Ho giocato con TempData e ho scritto l'id nella pagina dei dettagli tramite Html.Encode(). Mi fa diventare parte del modo in cui l'id compare sul modulo dell'oggetto ma il valore viene perso quando il modulo invia e pubblica. Suppongo perché non fa parte della collezione di form. Sto indovinando che la mia soluzione alternativa non è il modo migliore e vorrei sapere se qualcuno può indicare il modo corretto di farlo in asp.net mvc.

risposta

3

Faccio questo creando un nuovo percorso per il controller elemento che include l'ID ordine. Non ha senso avere un articolo senza un ordine, quindi l'OrderId è richiesto usando il parametro constraints.

routes.MapRoute(
    "OrderItems", 
    "Item/{action}/{orderId}/{id}", 
    new { controller = "Item" }, 
    new { orderId = @"d+" } 
); 

Così l'URL simile http://<sitename>/Item/Create/8, dove 8 è l'OrderId per la quale creare un elemento. Qualcosa di simile potrebbe essere fatto per Elimina percorsi di azioni con http://<sitename>/Item/Delete/8/5, dove 8 è OrderId e 5 è ItemId.

I suoi metodi di azione sarebbe simile a questa:

public ActionResult Create(int orderId) 

public ActionResult Delete(int orderId, int id) 

Si potrebbe anche impostarlo in modo che gli URL sembravano http://<sitename>/Order/8/Item/Create e http://<sitename>/Order/8/Item/Delete/5 se che sembra mostrare più chiaramente quello che sta succedendo.

Poi il percorso sarebbe simile a questa:

routes.MapRoute(
    "OrderItems", 
    "Order/{orderId}/Item/{action}/{id}", 
    new { controller = "Item" }, 
    new { orderId = @"d+" } 
); 
+0

Dennis - questo sembra molto meglio della mia idea. Un chiarimento però - come ottengo il orderId per sopravvivere al post del controller OrderItem. Sembra che voglia utilizzare la rotta predefinita, non quella appena creata. [AcceptsVerbs (HttpVerbs.Post)] public ActionResult Create (raccolta FormCollection) – etechpartner

+0

Assicurarsi che la route OrderItems sia elencata prima della route predefinita. Questo fa la differenza. Inoltre, è necessario includere il parametro orderId nel metodo Create: [AcceptsVerbs (HttpVerbs.Post)] public ActionResult Create (int orderId, raccolta FormCollection) – CoderDennis

+0

Quindi l'url del modulo di creazione della visualizzazione della vista deve contenere l'ID ordine come in/Order/8/Voce/Crea – CoderDennis

0

Ho usato questa sequenza (scusate se ci sono errori, ho preso questo da un esempio di lavoro e modificato per la tua domanda):

1) Nella vista Order.Details (assumere modello è di tipo di ordine):

... 
<%= Html.ActionLink("Create New Item", "Create", "OrderItem", new { orderId = Model.ID }, null)%> 
... 

2) Nell'azione OrderItem.Create:

public ActionResult Create(int orderId) 
{ 
    ViewData["orderId"] = orderId; 
    return View(); 
} 

3) Nella vista OrderItem.Create:

... 
<% using (Html.BeginForm(new { orderId = ViewData["orderId"] })) 
... 

4) Nell'azione OrderItem.Create POST:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(int orderId) 
{ 
    // omitted code to create item, associated with orderId 

    return RedirectToAction("Details", "Order", new { orderId = orderId }); 
} 

Se qualcuno può pensare a come migliorare su questo, o di un modo migliore del tutto, per favore, io sono un po 'nuovo a questo me stesso quindi mi piacerebbe migliorare.

0

Per andata e ritorno un campo che non fa parte del normale inserimento dei dati, io di solito uso un campo nascosto nella vista, in questo modo:

<%= Html.Hidden("OrderID", Model.OrderID) %> 

Sembra un campo modulo, si comporta come un campo modulo, ma l'utente non può vederlo. Assicurati di inserire l'OrderID corretto nel tuo modello dal controller.