2011-09-19 46 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”,匹配不以匿名类型传递的参数的方式。 –