2010-12-09 3 views
0

Ich habe eine abstrakte Klasse mit einer virtuellen Funktion bekommt definiert:zwingende eine virtuelle Methode, aber mit einer neuen Signatur: so Bindemittel benutzerdefiniertes Modell verwendet werden kann

public abstract class ContentController 
{ 
    public virtual ActionResult Index(); 
} 

ich eine Klasse habe, die von ableitet die obige Basisklasse:

public class CartController : ContentController 

ich brauche die CartController der Lage sein, einen Wagen mit einem benutzerdefinierten Modell Binder auf der Index-Methode zu binden. Etwas, das normalerweise würde wie folgt aussehen:

public ActionResult Index(Cart cart) 

Wenn ich nur den Index (Warenkorb) Funktion in die Klasse CartController platzieren, bekomme ich diesen Fehler:

The current request for action 'Index' on controller type 'CartController' is ambiguous between the following action methods: 
ActionResult Index() on type CartController 
ActionResult Index(Cart) on type CartController 

Die einzige Lösung, die ich gekommen bin oben so weit mit zu meinem Modell Bindungsfunktion und leitet aus der überschriebenen Index-Methode umbenennen:

public override ActionResult Index() 
    { 
     return RedirectToAction("IndexWithCart"); 
    } 

    public ActionResult IndexWithCart(Cart cart) 
    { 
     return View("Index", cart); 
    } 

das funktioniert, aber dann meine URL/Karre/IndexWithCart. Gibt es eine Möglichkeit, dies zu erreichen und immer noch nur die/Cart-URL zu haben, ohne die Basisklasse zu ändern?

+0

Nick - bedeutet dies dann nicht eine neue Sicht erfordert auch genannt IndexWithCart ?? (Das heißt, dass der Rückgabewert von ActionResult IndexWithCart() rein View (cart) ist) –

+0

Ich habe obige IndexWithCart-Methode so aktualisiert, wie ich sie in meinem Code habe (die Indexansicht wird zurückgegeben) –

Antwort

2

Ja gerade Setup Ihre Route zum IndexWithCart Aktion zu zeigen, wenn Sie die Option/Wagen URL haben:

routes.MapRoute(
       "IndexWithCartRoute", 
       "Cart", 
       new { controller = "Cart", action = "IndexWithCart" } 
      ); 
+0

Das war mein Bauchgefühl Gut. Es fühlt sich für mich einfach so an, als ob das Rout Mapping nicht wirklich dafür gedacht ist. Weißt Du, was ich meine? –

+0

@Nick - Sehen Sie, das ist die Schönheit der Route Mapping. Sie können einen sauberen URI erstellen und ihn einer beliebigen Art von Controller oder Aktion zuordnen.Wenn wir keine Mappings hätten, müssten wir immer die gleiche Konvention befolgen, damit URIs korrekt auf Controller oder Aktionen abgebildet werden. Auf diese Weise können wir unseren URI beliebig festlegen und kontrollieren, ob er von der richtigen Aktion auf dem richtigen Controller gehandhabt wird. – amurra

+0

Kam zu diesen Monaten später zurück und ging diese Route (kein Wortspiel beabsichtigt). Vielen Dank! –

0

wie etwa (für die Basis-Controller):

public abstract class ContentController<T> : Controller 
{ 
    public abstract ActionResult Index(T item); 
} 

gefolgt von (für der geerbte Controller):

// just for the example 
public class Cart 
{ 
    public string Foo { get; set; } 
} 

public class HomeController : ContentController<Cart> 
{ 
    public override ActionResult Index(Cart item) 
    { 
     //var cart = new Cart {Foo = "this is my cart test"}; 
     //return View(cart); 
     return View(item); 
    } 
} 

könnte funktionieren.

[Bearbeiten] - eine zweite Art und Weise zu versuchen, sein zu können (Basisklasse):

public abstract class ContentController<T> : Controller 
{ 
    public virtual ActionResult Index() 
    { 
     return View(); 
    } 
    internal ActionResult Index(T item) 
    { 
     return View(item); 
    } 
} 

und für den Controller:

// just for the example 
public class Cart 
{ 
    public string Foo { get; set; } 
} 

public class HomeController : ContentController<Cart> 
{ 
    public override ActionResult Index() 
    { 
     Cart cart = null; // new Cart { Foo = "this is my 1st cart test" }; 
     if (cart != null) 
      return Index(cart); 
     else 
      return base.Index(); 
    } 
} 

ich bin jetzt alle thunked aus :)

0

wie etwa mit [Httppost] dann
Aktion wil 'Index' l nicht mehrdeutig sein in Ihrer Basis Controllor und Kind Controllor

[Httppost] public Action Index (Warenkorb Warenkorb)

{  

    return View(cart);  

}  
Verwandte Themen