2016-05-15 1 views
1

J'essaie d'implémenter le routage personnalisé sur une application de base asp.net.Routage personnalisé de base Asp.net

Le résultat souhaité est la suivante:

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

paramètre Entity_SEO_Name sera une valeur unique enregistrée dans la base de données qu'il va me aider à identifier l'identifiant de l'entité que je J'essaie d'afficher.

Pour y parvenir, j'ai mis en place un itinéraire personnalisé:

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); 
    } 
} 

Mon contrôleur ActionResult:

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

Le problème avec cette approche est que les context.RouteData.Values ​​sont toujours vides . Des idées sur comment aller de l'avant avec celui-ci?

Répondre

0

Votre solution est trop compliquée. Vous pouvez avoir modèle de route comme

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

et de l'action du contrôleur comme

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

Il suffit, asp.net mvc est assez intelligent pour lier la variable seo au paramètre de chemin d'URL.