2014-02-12 141 views
0

我需要一些自定義路由爲我的網站。 我需要的URL出現這樣ASP.NET MVC - 自定義路由

  • www.domain.com/categoryname/subcategoryname
  • www.domain.com/categoryname
  • www.domain.com/categoryname/productname
  • www.domain.com/categoryname/subcategoryname/productname

請注意兩個大膽的網址AR e僅在URL的最後部分有所不同 我無法將控制器名稱和操作名稱用於此類型的URL。 如何在ASP.NET MVC中使用路由表執行此操作? 我這是不可能與路由表,是否有另一個工具來做到這一點?

感謝

回答

1

我知道幾種方法。

首先,我假設兩個URL之間有某種區別。如果「蘋果」也是一個有效的產品和類別名稱,那麼當然,如果URL模式相同,則無法區分它們。並且始終確保您的路由按正確的順序定義,路由引擎會將請求路由到第一個匹配路由,因此請首先放置更具體的路由。

最簡單的是,如果在subcategorynameproductname之間存在語法上的差異。然後路線限制是要走的路。您可以爲這兩個參數定義不同的正則表達式,並且它們將完美工作,路由引擎會知道將哪個請求路由到哪裏。 (見herehere

如果不存在語法差別,您能介紹一個。例如:

www.domain.com/categoryname/s_subcategoryname 
www.domain.com/categoryname/p_productname 

它不是太難看,也沒有衝突。

然後,你也可以實現你自己的IRouteConstraint。這樣你可以定義任何你想區分這兩條路線的邏輯。在列表中收集可能產品的名稱,然後將其與產品路線進行匹配。 (見here。)

您也可以定義自定義路由處理程序或HTTP處理程序,它執行相同的邏輯,前一段和做了Server.Transfer()實際執行不同的操作,但它的很多混亂,所以我不會」沒有建議。

0

沒有,這是不可能這樣的,因爲沒有URL路由引擎會知道如何將此類URL匹配到相應的路由。您需要以某種方式區分這些類型的網址,因此很清楚要使用哪一種類型的網址。

好的,好吧,有可能是一種方式,但它有點hacky ...你只是路由到一些通用的行動,那裏你會比較最後一部分到你的記錄,並決定,如果參數是一個產品名稱或一個子類別名稱,並返回一個視圖基於...

1

實現此目的的一種方法是通過繼承IRouteConstraint創建自定義RouteConstraint並將您的url保存在xml中。你需要知道的頁面模板類型,所以你可以在這樣一個枚舉存儲這樣的信息:

public enum TemplateType 
{ 
    Home, 
    Product, 
    Category 
} 

下面是一個示例XML,你可以用它來存儲數據:

<Sitemap> 
    <Item url="/home" TemplateType="Home" /> 
    <Item url="/products/category" TemplateType="Category"> 
    <Item url="/products/category/product" TemplateType="Product" /> 
    </Item> 
</Sitemap> 

後您將需要方法來提取Sitemap節點並獲取特定節點。您只需要反序列化xml並遍歷它即可找到特定的url。

您的自定義RouteConstraing應該是這樣的:

public class CustomRouteConstraint : IRouteConstraint 
{ 
    #region IRouteConstraint Members 

    private TemplateType m_type; 

    public CustomRouteConstraint(TemplateType type) 
     :base() 
    { 
     m_type = type; 
    } 


    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     bool returnValue = false; 
     SitemapNode sitemapNode = GetSiteMapNode(httpContext.Request); 

     if (sitemapNode != null && sitemapNode.TemplateType == m_type) 
     { 
      return true; 
     } 

     return returnValue; 

    } 

    #endregion 

    private static SitemapNode GetSiteMapNode(HttpRequestBase request) 
    { 
     //get the aboslute url 
     string url = request.Url.AbsolutePath; 

     return SitemapManager.GetSiteMapNode(url); 
    } 
} 

後你在的RegisterRoutes方法的Global.asax文件都的這地方,你需要做這樣的事情:

routes.MapRoute(
    "", // Route name 
    route, // URL with parameters 
    new { lang = "en", region = "us", controller = "Category", action = "Index" }, 
    new { param1 = new CustomRouteConstraint(TemplateType.Category) }); 

希望這會有所幫助。