2015-07-29 1 views
1

Je cette MAPROUTE par défaut:MAPROUTE personnalisé pour le contrôleur spécial et de l'action à être comme ça dans MVC: http://example.com/someValue

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

et quelques autres mapRoutes pour d'autres sontrollers avant par défaut,

maintenant, je veux un MAPROUTE pour le contrôleur spécial pour montrer l'URL comme: myDomain.com/someValue, mais quand j'utilise ceci:

routes.MapRoute(
name: "categories", 
url: "{sub}", 
defaults: new { controller = "cat", action = "Index" } 
); 

tous mes url .actions qui ont "Index" comme action comme @ Url.Action ("index", "login") fonctionne pas, je ai aussi utilisé:

sub = UrlParameter.Optional

et

sub = ""

, mais ils ne travaillaient pas, ce que dois-je faire?

Répondre

0

Votre route categories attrape toutes les URL car elle correspond au rôle. Vous devez écrire une classe de contraintes personnalisées pour filtrer les sub non appariés de votre base de données, par exemple.

public class MyCatConstraint : IRouteConstraint 
{ 
    // suppose this is your cats list. In the real world a DB provider 
    private string[] _myCats = new[] { "cat1", "cat2", "cat3" }; 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     // return true if you found a match on your cat's list otherwise false 
     // in the real world you could query from DB to match cats instead of searching from the array. 
     if(values.ContainsKey(parameterName)) 
     { 
      return _myCats.Any(c => c == values[parameterName].ToString()); 
     } 
     return false; 
    } 
} 

puis d'ajouter cette contrainte à votre itinéraire.

routes.MapRoute(
    name: "categories", 
    url: "{sub}", 
    defaults: new { controller = "cat", action = "Index" } 
    ,constraints: new { sub = new MyCatConstraint() } 
    ); 
+0

Merci beaucoup mec, cela fonctionne comme un charme. –

+0

désolé de commenter ceci ici, mais pourriez-vous s'il vous plaît voir cette question: [link] (http://stackoverflow.com/questions/34323981/mvc-routeconfig-custom-maproute-issue) –

0

La réponse de Sam est bonne mais je le ferais dans l'autre sens. Si votre paramètre {sub} pour "someValue" est dynamique (stocké dans la base de données), je créerais une contrainte qui exclurait vos contrôleurs existants. Donc, si vous appelez

domain.com/home ou domain.com/contact

il atteindrait ces contrôleurs autrement route à travers catégories. Par exemple:

public class NotEqual : IRouteConstraint 
{ 
    private string[] _match = null; 

    public NotEqual(string[] match) 
    { 
     _match = match; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     foreach(var controllername in _match) 
     { 
      if (String.Compare(values[parameterName].ToString(), controllername, true) == 0) 
       return false; 
     } 
     return true; 
    } 
} 

Version modifiée: http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints

et votre itinéraire serait:

 routes.MapRoute(
      name: "categories", 
      url: "{sub}", 
      defaults: new { controller = "cat", action = "Index" } 
      , constraints: new { sub = new NotEqual(new string[] { "Contact", "Home" }) } 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

De cette façon, tout ce que vous mettez qui est différent de domain.com/contact ou domain.com/home sont réactivées acheminés vers votre cat contrôleur

@Url.Action("Index","Contact") 

devrait produire:

/Contact