如何在ASP.NET MVC中创建一个返回没有控制器引用的URL的路由

时间:2010-02-07 05:55:50

标签: asp.net-mvc routes static-pages

我有一个控制器调用DefaultController。在这个控制器里面,我可以看到相当于静态页面的内容。

网址如www.site.com/Default/PageName

是否可以创建一个格式化这些URL的路径,如:

www.site.com/PageName

我想避免为每个人创建控制器。另一种方法是在根目录中创建.aspx页面,但我可以为这些页面创建路由,即:

www.site.com/PageName.aspx成为www.site.com/PageName?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以在PageName上为DefaultController操作创建显式路线,如下所示:

routes.MapRoute(
    "PageName",
    "pagename",
    new { controller = "DefaultController", action = "PageName" }
);

您必须将此路由放在默认MVC路由之前。这种方法的最大缺点是你必须为每个静态页面创建一个路由。

另一种方法是在默认的MVC路由之后添加一条额外的路径

routes.MapRoute(
    "DefaultController",
    "{page}/{*path}",
    new { controller = "DefaultController", action = "{page}" }
);

这种方法的缺点是该规则将处理所有URL,即使那些通常会返回404的URL。

答案 1 :(得分:1)

第一种方法

创建捕获操作的路线:

routes.MapRoute(
    "Catcher1",
    "{action}",
    new { controller = "Default", action = string.Empty });

但这意味着您必须在默认控制器上创建尽可能多的控制器操作。

第二种方法

如果您也想避免这种情况,只需要一个控制器+操作,请以这种方式写一条路线:

routes.MapRoute(
    "Catcher2",
    "{path}",
    new { controller = "Default", action = "PageName", path = string.Emtpy },
    new { path = @"[a-zA-Z0-9]+" });

此路线还定义了路线约束,因此它只捕获那些实际上在第一个路段中有某些东西的路线。您可以定义此约束以仅捕获您需要的请求(即path = "Result|Search|Whatever"

那么你的DefaultController会有这样的东西:

public ActionResult PageName(string path)
{
    // code goes here
}

第二种方法似乎非常可行,但我不推荐它,因为所有逻辑都必须通过此控制器操作(对于这些类型的请求)。将这些行动分成逻辑行动会更好。那些实际上做同样事情的人(所以他们没有一堆switch语句或类似的东西)将用不同的路由定义(如果他们不能用一个路由完成)。