2013-03-08 116 views
1

如何解決以下路由規則而不明確地將它們連接起來?MVC路由 - 參數和控制器名稱之間的衝突

我想補充友好的URL推廣的原因,像這樣:

domain.com/promoA 
domain.com/promoB 

這些應該由單一的「促銷活動」控制器處理。 (如果這是由「家」控制器處理我不介意)

然後,我想有直接映射到控制器

domain.com/account  ---> controller=account, action=index 
domain.com/account/login ---> controller=account, action=login 
domain.com/product/list ---> controller=product, action=list 
domain.com    ---> controller=home, action=index 

下面的表格是有可能的網址嗎?

謝謝!

+0

將您的宣傳片總是有一個像'/宣傳{}的東西'的網址是什麼?即你可以正則表達嗎? – Charlino 2013-03-08 18:54:37

+0

@Charlino - 不,他們沒有。這只是一個例子。 – 2013-03-08 21:08:45

+0

@BhushanFrake ...你知道,這是一個公平的問題。我在腦海中分析它,並沒有真正嘗試任何東西,從而癱瘓了。 : -/ – 2013-03-08 21:10:35

回答

1

我不確定這是否是最簡單的方法,但是您可以設置具有約束的路線。只要確保你在其他路線之前申報。

routes.MapRoute(
    "Promos", // Route name 
    "{action}", // URL with parameters 
    new { controller = "Promotions", }, // Parameter defaults 
    new { action = new PromoConstraint(), } 
); 

凡PromoConstraint被定義爲

public class PromoConstraint : IRouteConstraint 
{ 
    private readonly List<string> _promos = new List<string> { "promoA", "promoB", }; 

    public bool Match(
     HttpContextBase httpContext 
     , Route route 
     , string parameterName 
     , RouteValueDictionary values 
     , RouteDirection routeDirection 
    ) { 
     object value; 
     if(!values.TryGetValue(parameterName, out value)) return false; 

     var str = value as string; 
     if(str == null) return false; 

     return _promos.Any(promo => promo.ToLower() == str.ToLower()); 
    } 
} 
+0

這看起來像是正確的方法。我會嘗試一下。謝謝!!! – 2013-03-09 22:11:32

0

是的,這是可能的。

您只需在主控制器中檢查索引操作方法,即可查看產品表中是否存在提供的產品。如果是這樣,請返回該產品的視圖,否則,只返回索引視圖。

您需要爲所有其他控制器設置路由,如您在問題中所述。

並且您的根路徑需要指定它將採用可選的「產品」參數。

routes.MapRoute("Root", "{product}", new { controller = "Home", action = "Index", product = "" }); 

如果他們遵循一定的模式,你可以添加,將通過使用正則表達式添加約束處理這些宣傳片的新路線。

+0

不幸的是,它們沒有遵循任何特定的模式。我想避免爲我的所有控制器設置顯式路由。如果控制器存在,是否有辦法讓MVC只匹配通往{controller}的路徑? – 2013-03-08 21:16:06

相關問題