ASP.MVC路由没有Details操作

时间:2010-03-09 17:19:55

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

我希望网址比/ {Controller} / {Action} / {Id}更短。

例如,我想{Controller} / {Id},其中{Id}是一个字符串。

这将允许简单的路径,例如用户/用户名,页面/页面名称,新闻/新闻名称。我比在URL(用户/详细信息/用户名)中要求/ Details操作更好,这对最终用户来说不那么优雅。

我可以通过为任何我想要这种简单程度的控制器设置自定义路由来轻松完成这项工作。但是,这会导致实现其他操作时出现麻烦,例如{Controller} / {Action},其中{Action} ='Create',因为在这种情况下,字符串{Action}与字符串{Id}冲突。

我的问题:我怎么能有'保留'字样,所以如果网址是/新闻/创建,则会将其视为操作,但如果网址是其他内容,例如/新闻/ A-gorilla-ate-my-thesis,然后它被视为Id。

我希望在设置路线时可以定义这个?

更新

使用Ben Griswold的答案,我已将默认的ASP.NET MVC路由更新为:

    routes.MapRoute(
    "CreateRoute",                                            // route name
    "{controller}/Create",                                    // url with parameters
    new { action = "Create" }                                 // parameter defaults
);

routes.MapRoute(
    "DetailsRoute",                                           // route name
    "{controller}/{id}",                                      // url with parameters
    new { action = "Details" }                                // parameter defaults
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

这是一种魅力和手段,默认情况下,详细信息页面将使用简化的URL,但如果我愿意,我仍然可以定位特定的操作(更新/删除/详细信息)。

当然,您需要禁止将保留的“创建”单词作为ID,否则用户可能会尝试创建一个文章,例如,名称为“创建”,永远无法访问。

这真的很好。如果有人发现这种方法有问题,请加入,但我到目前为止都喜欢它。

1 个答案:

答案 0 :(得分:4)

我认为你只剩下为每个保留字创建一条路线。例如,

routes.MapRoute("CreateRoute",
               "{controller}/Create",
                new { action = "Create" }
            );

将处理/新闻/创建,/用户/创建等。只要此路线在您的其他自定义路线之前列出,我认为您已被覆盖。

我想你将需要各种CRUD操作的附加路径,这些操作将遵循类似的模式。