2012-04-07 2 views
0

Ich habe diese beiden URLs ich meinen Benutzern zur Verfügung stellen wollen:Verwirrt darüber, wie Controller Karte tatsächlich Ansichten in diesem Fall

/Account/Orders <- This would should be a grid of all orders. 
/Account/Orders/132 <- This would show this particular order information. 

Hier meine beiden ActionMethods sind:

[Authorize] 
public ActionResult Orders(int id) 
{ 
    using (var orderRepository = new EfOrderRepository()) 
    using (var accountRepository = new EfAccountRepository()) 
    { 
     OrderModel model = new OrderModel(); 
     return View(model); 
    } 
} 

[Authorize] 
public ActionResult Orders() 
{ 
    using (var orderRepository = new EfOrderRepository()) 
    using (var accountRepository = new EfAccountRepository()) 
    {    
     List<OrderModel> model = new List<OrderModel>(); 
     return View(model); 
    } 
} 

Wenn mein Die Auftragsansicht wird mit einem OrderModel als Modell stark typisiert, die Orders() Aktionsmethode wird nicht funktionieren, da ich sie statt eines einzelnen Objekts an IEnumerable übergeben muss.

Was schlagen Sie in diesem Fall vor? Dies scheint etwas zu sein, was leicht zu tun ist, aber ich hatte einen sehr langen (produktiven!) Tag, aber ich kann nur so weit gehen.

+0

Verwenden einen Edit (oder Liste) Methode und Index-Methode entsprechen sein ein bisschen mehr in der 'Standard' MVC Bereich –

Antwort

1

Ein paar Optionen:

1) Richten Sie Ihre Routen mit den meisten spezifischen ersten

MapRoute("first", "/Accounts/Orders/{id}" .... 
      controller="mycontroller" action="details" 
MapRoute("second", "/Accounts/Orders ..... 
      controller="mycontroller" action="summary" 

2) Anstelle von Routen haben zwei Methoden mit unterschiedlichen Signaturen erhalten:

public ActionResult Index() 
{ 
} 

[Action ("Index")] public Action IndexDetails (int id) { }

Routing sollte das

+0

Mann war ich letzte Nacht müde ... die Routen Einstellung ist die offensichtliche Lösung für dieses. Danke, dass du mein Gehirn wieder aufgebaut hast. :) –

+0

Gern geschehen! – mmcconnell1618

0

Sie können zwei verschiedene Ansichten haben. Eine für das Raster und eine für das Bestelldetail.

Dann können Sie sie wie folgt aufrufen:

return View("OrderGrid", Orders); // for grid 

return View("OrderDetail", Order); // for detail 
+0

Ich bekomme einen Fehler, bevor dieser Bereich des Codes sogar erreicht wird, heißt es, dass nur ein optionaler Parameter Null sein muss. Das heißt, dass ich beim Besuch von "Accounts/Orders" die falsche ActionMethode erreiche. –

1

Sie werden mit den Standardrouten Angenommen, Ihre zweite Order Methode nie aufgerufen werden. Die Route füllt den fehlenden Parameter id mit einem Nullwert aus, wenn keiner angegeben ist, und versucht, die Überladung mit dem Parameter id aufzurufen.

Sie können Ihre Routen ändern oder andere Dinge tun, um zu versuchen und dieses Problem zu umgehen, aber die schnellere Option ist nur innerhalb der Routing-System zu arbeiten:

public ActionResult Orders(int id = -1) 
{ 
    return id == -1 ? this.OrdersSummary() : this.OrdersDetail(id); 
} 

private ActionResult OrdersSummary() 
{ 
    var model = new SummaryModel(); 
    // fill in model; 
    return this.View("OrdersSummary", model); 
} 

private ActionResult OrdersDetail(int id) 
{ 
    var model = new DetailModel(); 
    // fill in model; 
    return this.View("OrderDetail", model); 
}  
+2

Sie können auch ein nullbares int (int? Id) verwenden und id.HasValue prüfen, anstatt eine -1 zu erzwingen. –

Verwandte Themen