ASP.MVC路由没有Details操作

Rog*_*ers 7 asp.net asp.net-mvc-routing asp.net-mvc-2

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

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

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

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

我的问题:我怎么能有'保留'字样,所以如果URL是/ News/Create,它被视为一个动作,但如果URL是其他任何东西,例如/ News/A-gorilla-ate-my-论文,然后它被视为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
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ben*_*old 4

我认为您需要为每个保留字创建一条路线。例如,

routes.MapRoute("CreateRoute",
               "{controller}/Create",
                new { action = "Create" }
            );
Run Code Online (Sandbox Code Playgroud)

将处理 /News/Create、/Users/Create 等。只要此路由列在其他自定义路由之前,我认为您就可以了。

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