如何删除MVC URL路由中的"详细信息",但保留其他操作?

Jas*_*son 2 asp.net-mvc asp.net-mvc-routing

我想为具有正常CRUD操作的控制器设置路由,但希望详细信息操作不在URL中显示"详细信息".Stackoverflow似乎配置了这种类型的路由:

http://stackoverflow.com/questions/999999/
http://stackoverflow.com/questions/ask
Run Code Online (Sandbox Code Playgroud)

使用这个类比,我的路线目前看起来像:

http://stackoverflow.com/questions/Details/999999/
Run Code Online (Sandbox Code Playgroud)

通过添加以下路线,我可以Details删除:

routes.MapRoute("Q1", "questions/{id}", 
    new { controller = "Questions", action = "Details" });
Run Code Online (Sandbox Code Playgroud)

但是,在控制器上启动其他操作(例如,/questions/new对于此示例)则抱怨无法解析id.

有没有办法设置路由,以便我不必手动输入所有其他操作(MapRoute"items/create","items/delete"等)到Global.asax.cs?我基本上想要第二条路线:

routes.MapRoute("Q2", "questions/{action}", 
    new { controller = "Questions", action = "Index" });
Run Code Online (Sandbox Code Playgroud)

...并且如果{id}匹配整数,并且{action}如果它是字符串,则让路由引擎使用路由Q1 .这可能吗?

Bla*_*ott 6

如果你在第一个上设置一个路由约束,这样id字段只能是一个整数,那么我相信任何其他的操作都会落到默认值.

routes.MapRoute("Q1", 
   "questions/{id}", 
   new {controller = "Questions", action = "Details"},
   new { id=@"\d+" });
Run Code Online (Sandbox Code Playgroud)

其他任何东西都应该由默认路由处理.所以"问题/ 3553"会打到这个,但"问题/问题"不匹配.您可能希望将更具体的路由放在Global.asax.cs文件中.