我有一个网址
@H_301_2@> http://www.roadkillwiki.org/Page/Index/documentation
@H_301_2@我想变成
@H_301_2@> http://www.roadkillwiki.org/Page/documentation
@H_301_2@这也可能像@L_404_2@ – 参数是一个字符串.我试过的路线设置是:
routes.MapRoute( "ControllerDefault","{controller}/{id}",new { controller = "Page",action = "Index",id = UrlParameter.Optional } );@H_301_2@然而,这干扰了MVC项目带来的默认“id”路由.有没有办法实现这个目标?
解决方法
您不需要丢失默认路由.避免路线相互干扰的关键是对它们进行排序,以便更具体的规则先于不太具体的规则.例如:
// Your specialized route routes.MapRoute( "Page","Page/{slug}",action = "Index" } ); // Default MVC route (fallback) routes.MapRoute( "Default",// Route name "{controller}/{action}/{id}",// URL with parameters new { controller = "Home",id = UrlParameter.Optional } // Parameter defaults );@H_301_2@然后你的PageController看起来像这样:
using System.Web.Mvc; public class PageController : Controller { public string Index(string slug) { // find page by slug } }@H_301_2@也就是说,我强烈建议你这样做:
// Your specialized route routes.MapRoute( "Page","Page/{id}/{slug}",slug = UrlParameter.Optional } ); // MVC's default route (fallback) routes.MapRoute( "Default",id = UrlParameter.Optional } // Parameter defaults );@H_301_2@而你的PageController:
using System.Web.Mvc; public class PageController : Controller { public string Index(int id) { // find page by ID } }@H_301_2@通过在URL的开头(如StackOverflow)或最后包含页面ID,您可以忽略slug,而是通过ID检索页面.如果您的用户更改页面名称,这将为您节省大量的麻烦.我经历过这一切,这很痛苦;你基本上必须记录你的页面过去所有的名字,这样你的访问者/搜索引擎每次重命名页面都不会得到404. @H_301_2@希望这可以帮助.