我有一个ASP.NET MVC应用程序可以很好地与少数几个控制器配合使用,例如: “家”,“服务”和“走”。 “Go”控制器是所有内容的所在。
现在营销人员已经来了,并说他们不希望在URL中看到“go”这个词。换句话说,而不是:
http://mydomain.com/go/geography/africa
他们想拥有:
http://mydomain.com/geography/africa
我无法为他们可能想要的每条路径创建一个控制器...所以有没有办法在Global.asax.cs中编写我的路由,以便对“服务”和“主页”的请求进行处理正常的方式,但其他任何东西将隐含地路由到“去”控制器?
答案 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}
”形式的任何内容 - 除非你能做一些聪明的约束。