2017-09-26 135 views
1

我有一个简单的路由映射。Url.Action()不会删除默认值

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}/{seoName}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, seoName = UrlParameter.Optional } 
); 

现在,如果使用Url.Action("Index", "Home"),它不会正确地删除路由的默认值。它给了我/Home/Index

现在,如果我删除{id}{seoName}及其相应的默认值,那么该URL将正确生成,如/(root)。

我在这里失踪了什么?它似乎不是一个环境价值,因为我正在访问没有id的主页,也没有seoNames。

任何想法?

+2

只有最后一个参数可以被标记'UrlParameter.Optional' –

+0

@StephenMuecke没有意识到的,有趣的。请回答问题以接受它。 –

+1

恩科西已经添加了一个:) –

回答

2

您将需要多个映射才能实现所需内容,因为只允许您将最后一个路径占位符设置为可选。

routes.MapRoute(
    name: "SeoFriendly", 
    url: "{controller}/{action}/{id}/{seoName}", 
    defaults: new { controller = "Home", action = "Index", seoName = UrlParameter.Optional } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);