asp.net mvc路由问题

时间:2010-08-04 19:38:17

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

默认路由正常

mysite.com/home/about

我甚至看到如何自定义它以缩短

所以我可以说:

mysite.com/edit/1 代替 mysite.com/home/edit/1

但是如何让它更长时间来处理url,如下所示

mysite.com/admin/user/1 //工作

mysite.com/admin/user/details //不起作用

mysite.com/admin/question/create //不起作用

我不能把id视为一个动作?我需要一条自定义路线?

我是否需要为每个表创建新的控制器,或者我可以通过管理控制器

进行所有控制

非常感谢

2 个答案:

答案 0 :(得分:2)

正如已经提到的,最好的选择可能是使用新的Areas功能

您可以在没有区域的情况下实现此类路由,但随着控制器数量的增加,站点的可维护性将会降低。基本上,您所做的是将控制器名称硬编码到Route定义中,这意味着您必须为每个新的Admin控制器添加新的路由映射。以下是一些如何在没有区域的情况下设置路线的示例。

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

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

或者你可以通过管理控制器路由所有内容,但是你的控制器操作执行多个角色会很快变得非常混乱。

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

您的AdminController操作如下所示:

public virtual ActionResult Create(string type, int id)
{
    switch (type)
    {
        case 'question':
            // switch/case is code smell
            break;
        case 'user':
            // switch/case is code smell
            break;
        // etc
     }
}

答案 1 :(得分:1)

向global.asax添加路由非常简单。将更具体的路线放在更一般的路线上方。控制器/动作/参数/参数最典型的模式......如果你需要更复杂的东西,你可能想看一下MVC区域。在上面的例子中,“mysite.com/admin/user/details”正在寻找一个名为“admin”的控制器和名为“user”的操作,其后的所有内容都是action方法的参数(假设是典型的路径设置)