第一种方法
创建一个捕获动作的路由:
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
声明或类似的东西)将用单独的路线定义(如果它们不能用一个单独的路线来完成)。