2009-06-30 5 views
5

Ich habe folgende Fall, wo ichasp.net mvc - Weg für String oder int (dh/Typ/23 oder/Typ/Hüte)

'/type/view/23' or '/type/view/hats' 

folgende router annehmen möchten, wo 23 die Id für Hüte.

Der Controller sieht wie folgt aus:

public class TypeController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult View(int id) 
    { 
     ... 
    } 
} 

Nun, wenn sie in 23 ohne Probleme passieren. Wenn sie Hüte weitergeben, habe ich etwas zu tun. Jetzt frage ich mich in diesem Fall würde ich Hüte auf 23 übersetzen mit einem ActionFilter, der aussieht, ob der Wert übergeben als die ID ist ein int (wenn ja, überprüfen Sie, ob es in der Datenbank existiert) oder wenn es eine Zeichenfolge aussieht up die Datenbank für was die ID der Zeichenfolge, die übergeben wurde, ist. In jedem Fall würde ich, wenn eine Übereinstimmung nicht gefunden wird, den Benutzer zu einer anderen Aktion umleiten.

Erstens ist der Ansatz, den ich richtig benannt habe, zweitens ist es möglich, eine Umleitung von innerhalb eines ActionFilter durchzuführen.

Prost Anthony

Antwort

4

Ändern Sie Ihre Signatur, um eine Zeichenfolge zu akzeptieren. Dann überprüfe, ob der Wert von id ein int ist. Wenn ja, suche nach ID, wenn nicht nach Namen gesucht wird. Wenn Sie keine Übereinstimmung finden, führen Sie Ihre Weiterleitung durch.

public class TypeController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult View(string id) 
    { 
     Product product = null; 
     int productID = -1; 
     if (int.TryParse(id, out productID)) 
     { 
      product = db.Products 
         .Where(p => p.ID == productID) 
         .SingleOrDefault(); 
     } 
     else 
     { 
      product = db.Products 
         .Where(p => p.Name == id) 
         .SingleOrDefault(); 
     } 

     if (product == null) 
     { 
      return RedirectToAction("Error"); 
     } 
     ... 
    } 
} 

Der Grund, dass ich das tun würde, ist, dass, um zu wissen, welche Controller/Aktionen anwenden, wird der Rahmen für einen suchen gehen, die die Signatur der Routendaten übereinstimmt, die in übergeben wird. Wenn Sie don Wenn Sie eine Signatur haben, die übereinstimmt - in diesem Fall eine, die eine Zeichenkette verwendet - erhalten Sie eine Ausnahme, bevor einer Ihrer Filter aufgerufen wird. Leider glaube ich nicht, dass man eine haben kann, die eine Zeichenkette nimmt, und eine andere, die ein int braucht - in diesem Fall wird das Framework nicht in der Lage sein, zu sagen, welche übereinstimmen sollte, wenn zumindest ein Parameter übergeben wird eine Zahl, das ist. Indem Sie es zu einem String-Parameter machen und die Übersetzung selbst handhaben, erlauben Sie dem Framework, seine Arbeit zu verrichten, und Sie erhalten das gewünschte Verhalten - ohne Filter.

+1

Nachdenken über einen Weg für den Rahmen zu finden, um die Arbeit zu tun, könnte ich zwei Router wie folgt aus: this._Routes.MapRoute („TypeInt“ , "type/view/{id}", neu {controller = "Type", action = "ViewInt"}, neu {page = @ "^ \ d + $"}); this._Routes.MapRoute ("TypString", "type/view/{id}", neu {controller = "Type", action = "ViewString"}); Würde es sich lohnen, dies zu tun ?? oder denkst du, versuch es einfach? –

+0

Ich sehe nicht, was Sie gewinnen, indem Sie der Routing-Infrastruktur Komplikationen hinzufügen, außer dass es das Parsing für Sie durchführt. Ich bin nicht schlau genug zu wissen, ob es funktionieren würde, ohne es tatsächlich zu testen.Persönlich würde ich wahrscheinlich zwei verschiedene Aktionen haben View und ViewByName, die beide die gleiche private Methode verwenden, um die Daten zu generieren, sobald das richtige Produkt gefunden wurde. Für mich wäre das noch einfacher und klarer. – tvanfosson

0

Ungewiss Sie dies tun können. Ich würde denken, dass Sie eine Zeichenfolge übergeben und dann überprüfen müssen, ob es eine numerische ist, aber es könnte einen besseren Weg geben.

Wie für die Verwendung Umleitung

return RedirectToAction("MyProfile", "Profile"); 

Sie können die Routen Werte als Teil des RedirectToAction Aufruf übergeben, so dass Sie in ids oder Namen passieren kann usw., wenn das ist, was erforderlich ist.

Es gibt andere wie Umleitungen auf Routen, die auch hilfreich sein können für das, was Sie wollen.

+0

Mit der Umleitung Ich dachte, dies zu tun aus dem Action –

Verwandte Themen