我有一个名为DefaultController的控制器。在这个控制器中,我有相当于静态页面的视图。
URL类似于www.site.com/Default/PageName
是否可以创建一条路由,将这些URL格式化为:
www.site.com/PageName
我希望避免为每一个都创建控制器。另一种方法是在根目录中创建.aspx页面,但我是否可以为这些页面创建路由,即:
www.site.com/PageName.aspx变成www.site.com/PageName?
谢谢!
发布于 2010-02-07 14:08:45
您可以为DefaultController上的PageName操作创建显式路由,如下所示:
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-07 20:25:20
第一种方法
创建捕获动作的路由:
routes.MapRoute(
"Catcher1",
"{action}",
new { controller = "Default", action = string.Empty });但这意味着你必须在你的默认控制器上创建同样多的控制器动作。
第二种方法
如果您也想避免这种情况,而只有一个controller+action,那么可以这样写一条路由:
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语句或类似的语句)将被定义为单独的路由(如果它们不能使用一个单独的路由来完成)。
https://stackoverflow.com/questions/2216106
复制相似问题