1

我有一个控制器调用 DefaultController。在这个控制器中,我有关于静态页面等价物的视图。

URL 看起来像 www.site.com/Default/PageName

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

www.site.com/PageName

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

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

谢谢!

4

2 回答 2

3

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。

于 2010-02-07T06:08:44.817 回答
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声明或类似的东西)将用单独的路线定义(如果它们不能用一个单独的路线来完成)。

于 2010-02-07T12:25:19.510 回答