我的路线没有开火,这应该有效吗?

时间:2010-01-27 17:00:45

标签: c# asp.net-mvc routes

对于我的管理区域,我创建了一条特殊路线。我做了这个,所以我的网址看起来更干净,它避免了我有两个同名控制器的问题。

示例:我有一个UserController和另一个AdminUserController用于应用程序的管理站点。

我不希望网址像:

http://www.example.com/user/...
http://www.example.com/admin/adminuser/...

我希望管理员网址看起来像:

http://www.example.com/admin/user/...

现在为了获得这个url结构,我尝试了这个:

我命名了我的管理员控制器:AdminUserController

然后我的路线看起来像:

routes.Add(new Route("admin/Admin{controller}/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""});
});

这可以吗? (该路线目前无效)

我确保这条路线在通用路线上方。

更新

我希望我的所有管理员网址都以/ admin /文件夹作为前缀,所以:

www.example.com/admin/user
www.example.com/admin/settings
www.example.com/admin/articles

和非管理员就像:

www.example.com/user
www.example.com/articles

4 个答案:

答案 0 :(得分:3)

不,那不行。

请记住,我们会将“Controller”附加到为{controller}传入的网址部分。因此,在那里工作的URL是:

/管理/ AdminAdminUser /

试试这个。

routes.Add(new Route("admin/user/admin/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "AdminUser", action = "index", Id=""})
});

我假设AdminUser控制器是一种特殊情况,并且您没有以/ user /开头的其他控制器。如果您这样做,另一种方法是将AdminUserController重命名为AdminController。然后:

routes.Add(new Route("admin/user/{controller}/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""}),
  Constraints = new RouteValueDictionary(new { controller = "Admin|Other|Other2"})
});

这里我使用约束来限制此特定路径适用的控制器。

BTW,我建议使用MapRoute扩展方法。它们使得路径注册更加简洁。

答案 1 :(得分:3)

routes.Add(new Route("admin/Admin{controller}/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""});
});

将强制您拥有“admin / AdminUser”...

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

将允许您拥有一个带有操作用户的管理控制器


更准确地说,您要做的是创建一个区域(使用MVC 2)

http://odetocode.com/Blogs/scott/archive/2009/10/13/asp-net-mvc2-preview-2-areas-and-routes.aspx

应该给你你想要的东西......

答案 2 :(得分:0)

使用1.0时,唯一的方法是:

使用1.0,唯一的方法是使用

单独映射每个控制器
   routes.MapRoute(
            "AdminUserRoute",                     // Route name
            "admin/user/{action}/{id}",           // URL with parameters
        new { controller = "AdminUser", action = "Index", id = "" } 
    );

   routes.MapRoute(
            "AdminWorkRoute",                    // Route name
            "admin/work/{action}/{id}",          // URL with parameters
        new { controller = "AdminWork", action = "Index", id = "" }                
    );

答案 3 :(得分:0)

创建一个IRouteHandler的实现,它将拦截所请求的控制器并将“admin”附加到前面

public class AdminRouteHandler : IRouteHandler
{
    private readonly IRouteHandler _mvcHandler = new MvcRouteHandler();
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var values = requestContext.RouteData.Values;
        if(values.ContainsKey("controller"))
            values["controller"] = "Admin" + values["controller"];
        return _mvcHandler.GetHttpHandler(requestContext);
    }
}

在注册路线时使用它,将Home替换为 admin / 指示您的控制器。默认情况下保留Home会在通过AdminHome后映射到AdminRouteHandler

routes.Add(new Route("admin/{controller}/{action}/{id}", new AdminRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Home", action = "index",     Id=""});
});