2009-06-04 17 views
5

Ich zeige eine Liste von Elementen für eine bestimmte Bestellung an. Wenn ein Nutzer auf "Objekt hinzufügen" klickt, leite ich auf die Seite "Artikel/Erstellen" um. Diese Seite sammelt die notwendige Eingabe, muss aber auch die Bestell-ID kennen, zu der das Element gehört. Was ist die geeignete Methode, um die Bestell-ID an den Artikel/Erstellen zu übergeben, damit sie den Formular-Post überlebt, wenn der neu erstellte Artikel gespeichert wird?ASP.NET MVC Erstellen einer Master-Detail-Beziehung

Ich habe mit TempData gespielt und schreibe die ID auf der Detailseite über Html.Encode(). Es bringt mich einen Teil des Weges dahin, dass die ID auf dem Gegenstandsformular erscheint, aber der Wert ist verloren, wenn das Formular vorlegt und Posten. Ich nehme an, weil es nicht Teil der Formsammlung ist. Ich rate, meine Workaround ist nicht der beste Weg und würde gerne wissen, ob jemand den richtigen Weg, dies in asp.net mvc tun kann.

Antwort

3

Ich mache dies, indem ich eine neue Route für den Item-Controller, der die OrderId enthält, erstelle. Es macht keinen Sinn, ein Item ohne eine Order zu haben, daher wird die OrderId benötigt, die den Constraints-Parameter verwendet.

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

So würde die URL wie http://<sitename>/Item/Create/8 aussehen, wo 8 die OrderId, für die ein Element zu erstellen. Ähnliches könnte für Aktionslinien löschen mit http://<sitename>/Item/Delete/8/5 gemacht werden, wobei 8 die OrderId und 5 die ItemId ist.

Aktionsmethoden würde wie folgt aussehen:

public ActionResult Create(int orderId) 

public ActionResult Delete(int orderId, int id) 

Man könnte es auch eingerichtet, so dass die Urls wie http://<sitename>/Order/8/Item/Create und http://<sitename>/Order/8/Item/Delete/5 sah, wenn das zeigen scheint deutlicher, was los ist.

Dann würde die Route wie folgt aussehen:

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

Dennis - das sieht viel besser aus als meine Idee. Eine Klarstellung allerdings - wie bekomme ich die OrderId, um den Post des OrderItem Controllers zu überleben. Es scheint, dass es die Standardroute verwenden möchte, nicht die neu erstellte Route. [AcceptsVerbs (HttpVerbs.Post)] Öffentlich ActionResult Create (FormCollection-Auflistung) – etechpartner

+0

Stellen Sie sicher, dass die OrderItems-Route vor der Standardroute aufgeführt ist. Das macht einen Unterschied. Außerdem müssen Sie den orderId-Parameter in Ihre Create-Methode einfügen: [AcceptsVerbs (HttpVerbs.Post)] public ActionResult Create (int orderId, FormCollection-Auflistung) – CoderDennis

+0

So sollte die Formular-Post-URL Ihrer Create-Ansicht die orderId wie in/Order/8 enthalten/Artikel/Erstellen – CoderDennis

0

Ich habe diese Sequenz verwendet (sorry, wenn es Fehler gibt, nahm ich dies aus einem Arbeitsbeispiel und modifiziert es für Ihre Frage):

1) In der Order.Details Ansicht (nehmen Modell ist von Typ-Auftrag):

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

2) In der OrderItem.Create Aktion:

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

3) In der OrderItem.Create Ansicht:

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

4) In der OrderItem.Create POST Aktion:

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

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

Wenn jemand vorstellen kann, wie dies zu verbessern, oder von einem besseren Weg insgesamt, bitte läuten Sie herein, ich bin irgendwie neu zu diesem selbst, also möchte ich mich verbessern.

0

Um Round-Trip ein Feld, das nicht Teil der normalen Dateneingabe ist, verwende ich generell ein verstecktes Feld in der Ansicht, wie folgt aus:

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

Es sieht aus wie ein Formularfeld, wirkt wie ein Formularfeld, aber der Benutzer kann es nicht sehen. Stellen Sie sicher, dass Sie die richtige Bestell-ID vom Controller in Ihr Modell übertragen.

Verwandte Themen