我有一个控制器调用DefaultController。在这个控制器里面,我可以看到相当于静态页面的内容。
网址如www.site.com/Default/PageName
是否可以创建一个格式化这些URL的路径,如:
www.site.com/PageName
我想避免为每个人创建控制器。另一种方法是在根目录中创建.aspx页面,但我可以为这些页面创建路由,即:
www.site.com/PageName.aspx成为www.site.com/PageName?
谢谢!
答案 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
语句或类似的东西)将用不同的路由定义(如果他们不能用一个路由完成)。