2011-09-19 58 views
0

在我的佈局頁,到彌補我的網站的主要欄目的鏈接呈現與呼叫這樣的:Url.Action重用路線數據時,我不希望它

@SiteSectionLink("index", "blog", "blog") 

SiteSectionLink是一個輔助,看起來像這樣:

@helper SiteSectionLink(string action, string controller, string display) 
    { 
    <li> 
    <h1> 
     <a class="site-section" href="@Url.Action(action, controller)">@display</a></h1> 
    </li> 
} 

在實際的博客頁面,各個環節也請參閱「索引」行動也是指定一個日期參數(如「博客/ 4-2011」或「博客/ 2010「),用於按日期過濾帖子。除此之外,還有一個可選的postID參數用於引用特定的帖子。

爲了實現這個目標,我有以下途徑:

routes.MapRoute(
"Blog", 
"blog/{date}/{postID}", 
    new 
    { 
    controller = "blog", 
    action = "index", 
    date = UrlParameter.Optional, 
    postID = UrlParameter.Optional 
    } 
); 

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

現在的問題是,當我點擊了一個鏈接,是像「博客/ 11-2010」或「博客/ 11- 2010/253「,那麼我的佈局頁面中的鏈接現在指的是我的博客當我希望它只鏈接到」blog /「而不是」blog/11-2010「時,指的是相同的URL。

如果我改變SiteSectionLink幫手在空明確地傳遞了datepostID這樣的:

<a class="site-section" href="@Url.Action(action, controller, 
    new { date = (string)null, postID = (int?)null})">@display</a></h1> 

當前的路由值仍在使用,但現在它看起來像「?博客日期= 11-2010」 。

我看到this類似的問題,但接受的答案不爲我工作,我不首先使用ActionLink我懷疑ActionLink將使用Url.Action引擎蓋下。

回答

3

儘管您遇到的問題並不完全是Phil Haack在this blog post中關於MVC3路由的錯誤和具有兩個可選參數的路由所詳述的行爲,但我會建議應用Phil的帖子中描述的修復。

我也建議不要用兩個可選參數創建路線,而是按照將所需路線分成兩個單獨路線的模式。

+0

謝謝你的改進分裂路線,你說得對,有兩個可選配只會引起頭痛。 – JulianR

+0

第二個想法是,我將其標記爲答案,因爲這是解決它的分裂問題,再加上對SiteSectionLink的重載。 – JulianR

1

是的Url.Action方法將參數放入查詢字符串中。 你可以改變你的助手這樣的:

​​

所以,你可以使用SiteSelectionLink這樣的:

@SiteSectionLink("Index", "Blog", "test", "2011", "4") 
@SiteSectionLink("Index", "Blog", "test2", "2011") 
@SiteSectionLink("Index", "Blog", "test3") 
+0

謝謝,我添加了一個可選的'routeValues'參數給'SiteSectionLink',它將date和postID設置爲null。我仍然好奇它爲什麼會這樣表現,這種行爲何時想要? – JulianR

+0

當我們爲與段變量不一致的屬性提供值時,Url.Action方法使用查詢字符串參數。在你的情況下,我認爲這是由於mvc引擎將url解碼爲路由「blog」,匹配不以匿名類型傳遞的參數的方式。 –