将Index设置为控制器的默认路由

时间:2011-03-09 22:17:29

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我有一个网址

我想变成

这也可能是http://www.roadkillwiki.org/Page/my-url-with-spaces - 参数是一个字符串。我尝试过的路线设置是:

routes.MapRoute(
    "ControllerDefault",
    "{controller}/{id}",
    new { controller = "Page", action = "Index", id = UrlParameter.Optional }
);

然而,这会干扰MVC项目带来的默认“id”路由。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:17)

您无需丢失默认路线。避免路线相互干扰的关键是对它们进行排序,以便更具体的规则先于不太具体的规则。例如:

// Your specialized route
routes.MapRoute(
    "Page",
    "Page/{slug}",
    new { controller = "Page", action = "Index" }
);

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

然后你的PageController看起来像这样:

using System.Web.Mvc;

public class PageController : Controller
{
    public string Index(string slug)
    {
        // find page by slug
    }
}

那就是说,我会强烈建议你这样做:

// Your specialized route
routes.MapRoute(
    "Page",
    "Page/{id}/{slug}",
    new { controller = "Page", action = "Index", slug = UrlParameter.Optional }
);

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

你的PageController:

using System.Web.Mvc;

public class PageController : Controller
{
    public string Index(int id)
    {
        // find page by ID
    }
}

通过在URL的开头(如StackOverflow)或最后包含页面ID,您可以忽略slug,而是通过ID检索页面。如果您的用户更改页面名称,这将为您节省大量的麻烦。我经历过这个,很痛苦;你基本上必须保留你的网页过去所有名字的记录,这样你的访问者/搜索引擎每次重命名页面都不会得到404。

希望这有帮助。

答案 1 :(得分:2)

如果您不需要项目模板附带的默认路线,您可以设置如下:

routes.MapRoute(
    "ControllerDefault",
    "{controller}/{pagename}",
    new { controller = "Page", action = "Index" }
);

而在你的控制器中,你会有一个动作:

        public ActionResult Index(string pagename)
        {
            //do something
        }