2016-05-15 22 views
1

Ich versuche, benutzerdefinierte Routing auf einer asp.net Core-Anwendung zu implementieren.Asp.net Kern Benutzerdefinierte Routing

Das gewünschte Ergebnis ist die folgende:

http://Site_URL/MyController/Action/ {Entity_SEO_Name}/

Entity_SEO_Name Parameter wird ein eindeutiger Wert in der Datenbank gespeichert werden, dass es mich zu identifizieren die ID des Unternehmens helfen wird, dass ich versuche zu zeigen.

Um zu erreichen, dass ich eine benutzerdefinierte Route umgesetzt habe:

routes.MapMyCustomRoute(
      name: "DoctorDetails", 
      template: "  {controller=MyController}/{action=TestRoute}/{name?}"); 


public class MyTemplateRoute : TemplateRoute 
{ 
    public override async Task RouteAsync(RouteContext context) 
    { 
     //context.RouteData.Values are always empty. Here is the problem. 
     var seo_name = context.RouteData.Values["Entity_SEO_Name"]; 

     int entityId = 0; 
     if (seo_name != null) 
     { 
      entityId = GetEntityIdFromDB(seo_name); 
     } 
     //Here i need to have the id and pass it to controller 
     context.RouteData.Values["id"] = entityId; 
     await base.RouteAsync(context); 
    } 
} 

Meine Controller Action:

public ActionResult TestRoute(int id) 
    { 
     var entity = GetEntityById(id); 
      return Content(""); 
    } 

Das Problem bei diesem Ansatz ist, dass die context.RouteData.Values ​​immer leer sind . Irgendwelche Ideen, wie man mit diesem voranbringt?

Antwort

0

Ihre Lösung zu kompliziert. Sie können die Routen Vorlage wie

template: "{controller=Home}/{action=Index}/{seo?}" 

und Controller-Aktion nur haben wie

public ActionResult TestRoute(string seo) 
{ 
    var entity = GetEntityBySeo(seo); 
    return Content(""); 
} 

Es ist genug, asp.net MVC ist intelligent genug, um SEO-Variable auf die Parameter von URL-Pfad zu binden.