【问题标题】:How to remove 'Details' in MVC URL Routing, but leave other actions intact?如何删除 MVC URL 路由中的“详细信息”,但保留其他操作不变?
【发布时间】:2009-06-16 12:45:52
【问题描述】:

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

http://stackoverflow.com/questions/999999/
http://stackoverflow.com/questions/ask

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

http://stackoverflow.com/questions/Details/999999/

通过添加以下路线,我能够删除 Details

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

但是,在控制器上调用其他操作(例如,此示例中的 /questions/new)抱怨无法解析 id。

有没有办法设置路线,这样我就不必手动将所有其他操作(MapRoute“项目/创建”、“项目/删除”等)手动输入到 Global.asax 中。 CS?我基本上希望有第二条路线,例如:

routes.MapRoute("Q2", "questions/{action}", 
    new { controller = "Questions", action = "Index" });

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    如果您对第一个设置了路由约束,使得 id 字段只能是整数,那么我相信任何其他操作都会采用默认设置。

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

    其他任何事情都应该由默认路由处理。所以“questions/3553”会命中这个,但“questions/ask”会不匹配。您可能希望在 Global.asax.cs 文件中首先放置更具体的路线。

    【讨论】:

    • 这非常有效。但是请注意,该约束需要读作@"\d+"。
    • 感谢您的澄清,我通常在表达式后使用长度限制器(即@"\d{2}"),所以我不确定要简单地输入一个整数。
    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多