2010-12-06 29 views
0

J'utilise asp.net mvc pour mon projet de site Web. Je pense que j'ai tort dans ma routedata mais je ne suis pas sûr que ce soit faux ou correct. Je vais expliquer la situation. Je mise en cache mes résultats d'action (sorties html) en cache avec une cléMVC RouteDatas sont confus

 public static string GetKeyFromActionExecutingContext(ControllerContext filterContext) 
    { 
     StringBuilder keyBuilder = new StringBuilder(); 

     if (filterContext.IsChildAction) 
      keyBuilder.Append("C-"); 
     else 
      keyBuilder.Append("P-"); 

     foreach (var item in filterContext.RouteData.Values) 
     { 
      keyBuilder.AppendFormat("{0}={1}.", item.Key, item.Value); 
     } 

     return keyBuilder.ToString(); 

    } 

généré ex: Pour HomePage, clé de cache généré est P-Controller = Home.Action = Index et

J'ai aussi childactions dans mon sitemaster comme LoginBox (Il est dans MembershipController/LoginBox) Sa clé de cache est C-Controller = Membership.Action = LoginBox.

Tout va bien jusqu'à maintenant.

J'ai aussi sous-catégories dans mon site comme domaine/category1 domaine/category1/subcategory1 domaine/category1/subcategory2 domaine/category2

Quand je suis en train de naviguer une sous-catégorie de domaine/category1 Mon généré clés sont échoué parce que mes routedatas ont tort

filterContext.RouteData.Values: Controller = membres action = LoginBox ctg1 = category1 ctg2 = "" ctg3 = ""

Pourquoi ceux-ci sont mélangés. Il utilise le routage "Category" mais je pense qu'il doit utiliser le routage "Default".

Mon global.asax comme ci-dessous

routes.MapRoute(
      "Category", 
      "{ctg0}/{ctg1}/{ctg2}/{ctg3}", 
     new 
     { 
      controller = "Category", 
      action = "Index", 
      ctg0 = "", 
      ctg1 = "", 
      ctg2 = "", 
      ctg3 = "" 
     }, 
     new 
     { 
      ctg0 = new CategoryRouteConstraint(), 
     } 
     ); 

routes.MapRoute(
       "Default",            
       "{controller}/{action}/{id}",           new { controller = "Home", action = "Index", id = "" }, 
       new { controller = @"[^\.]*" }       
      ); 

également ma CategoryRouteConstraint méthode, il vérifie de db que la valeur ctg0 est un nom de catégorie

public class CategoryRouteConstraint : IRouteConstraint 
{ 

    public Boolean Match(
     HttpContextBase httpContext, 
     Route route, 
     String sParameterName, 
     RouteValueDictionary values, 
     RouteDirection routeDirection 
     ) 
    { 
     if ((routeDirection == RouteDirection.IncomingRequest)) 
     { 
      if (values["ctg0"] != null && !string.IsNullOrEmpty(values["ctg0"].ToString())) 
       return Category.IsRoutingForCategory(values["ctg0"].ToString()); 
      return false; 
     } 
     return false; 
    } 


} 

Répondre