2010-07-24 2 views
6

현재 ASP.NET MVC 2.0을 사용하는 전자 상점에서 작업하고 있습니다. 나는 이미 그것들의 대부분을 가동시키고 있지만, 나를 괴롭히는 부분은 라우팅이다.전자 상점의 카테고리 이름에 대한 MVC 2.0 동적 라우팅

routes.MapRoute(
      "Category", 
      "{alias}/{pageNumber}", 
      new { controller = "Categories", action = "Browse", pageNumber = 1 }); 

을하지만 내가 원하는 단지보다 너무 많이 잡는다 : 지금까지 내가 사용하여 해결할 수있었습니다

http://mystore.somewhere/my-category-1/

:이합니다. 본질적으로 내가

foreach (var c in Categories) 
     { 
      routes.MapRoute(
       c.Name, 
       "{" + c.Alias + "}/{action}/...anything else", 
       new { controller = "Category", action = "Index" }).RouteHandler = new CateegoryRouteHandler(c); 
     } 
을하고있을 거라고 있도록

이 사이트의 주위에 몇 가지 질문과 답변을 통해 읽은 후, 나는, 프로그램 내 각 범주에 대한 경로를 등록하라고 요구하는 것 particulary 흥미로운 해결책을 발견

당신은 어떻게 생각하세요? 이것은 좋은 생각입니까? 나는 아마도 약 200 개의 범주를 가지게 될 것인데, 너무 많은 "경로"가 라우팅 테이블에 있어야합니까? 다른 해결책을 제안 해 주시겠습니까?

감사합니다.

감사합니다, Anže

답변

5

동적 제약 조건을 가진 하나의 경로는 더 우아한 해결책이 될 수 있습니다. 카테고리와 일치하는 제약 조건을 설정하기 만하면됩니다.

 routes.MapRoute(
     "Category", 
     "{alias}/{pageNumber}", 
     new { controller = "Categories", action = "Browse", alias = UrlParameter.Optional, pageNumber = 1 }, 
     new { alias = new CategoryMatchConstraint() }); 


public class CategoryMatchConstraint : IRouteConstraint 
{ 
     public bool Match(HttpContextBase httpContext, 
         Route route, 
         string parameterName, 
         RouteValueDictionary values, 
         RouteDirection routeDirection) 
     { 
      var category = values.Values[parameterName] as string; 
      if (string.IsNullOrEmpty(category)) 
      { 
       return false; 
      } 
      using (var db = new MyDatabaseContext()) 
      { 
       return db.Categories.Any(c => c.Name == category); 
      } 
     } 
} 
+0

대단합니다! 그것은 마치 매력처럼 작동했습니다! 경로 제한에 대해 몰랐습니다. 고마워요! –

+0

안녕하세요 @ tvanfosson, 50K 카테고리가 있다면 성능은 어떨까요? 내가 아는 한 거기에 경로 테이블 캐싱이나 뭐 그런 있지만 어떤 경우에는 그것은 db에서 확인합니다. –