ASP.NET MVC:如何将所有未指定的URL指向一个控制器

时间:2011-03-16 13:53:37

标签: c# asp.net asp.net-mvc

我有一个ASP.NET MVC应用程序可以很好地与少数几个控制器配合使用,例如: “家”,“服务”和“走”。 “Go”控制器是所有内容的所在。

现在营销人员已经来了,并说他们不希望在URL中看到“go”这个词。换句话说,而不是:

http://mydomain.com/go/geography/africa
他们想拥有:

http://mydomain.com/geography/africa

我无法为他们可能想要的每条路径创建一个控制器...所以有没有办法在Global.asax.cs中编写我的路由,以便对“服务”和“主页”的请求进行处理正常的方式,但其他任何东西将隐含地路由到“去”控制器?

5 个答案:

答案 0 :(得分:3)

你在IIS7上吗?为此可能最容易在服务器上实现URL重写,而不是在Global.asax.cs中使用您的路由进行黑客攻击。

编辑:我在Apache中只进行了URL重写。使用类似的东西可以做到这一点:

RewriteEngine On
RewriteRule ^go/(.+)$ /$1 [R=301,L]

查看http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module/。希望他们能给你足够的信息,以便能够在IIS 7中使用它

答案 1 :(得分:2)

嘿,我自己做了,没有重写URL!

Global.asax.cs中的RegisterRoutes()

routes.MapRoute("Services", "services/{action}/{*qualifier}",
  new { controller = "Services", action = "Index", qualifier = UrlParameter.Optional });
// and other controllers that I want to work the normal way
routes.MapRoute("Default", "{*path}", 
  new { controller = "Go", action = "Index", path = UrlParameter.Optional });

在我的GoController班级

public ActionResult Index(string path) { ... }

完美无缺!

答案 2 :(得分:1)

您可以尝试添加执行“geography/{country}”的映射,并让它手动指定控制器并将国家/地区添加为参数。我已经看到它可以防止“Dashboard/Dashboard”之类的事情。

我可以在Kazi Manzur Rashid's Blog - ASP.NET MVC Best Practices (Part 2)#15看到一个例子。

答案 3 :(得分:1)

答案 4 :(得分:0)

您可以尝试使用控制器的默认设置映射“{action}/{id}”的路由。但这也会匹配“{controller}/{action}”形式的任何内容 - 除非你能做一些聪明的约束。