2010-01-27 45 views
2

对于我的行政区域,我创建了一条特殊路线。我这样做是为了让我的网站看起来更干净,并且避免了我拥有2个同名控制器的问题。我的路线没有开火,应该工作吗?

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

我不想网址,如:

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

我想管理URL的样子:

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=""}); 
}); 

可以工作吗? (该路线目前不工作)

我确保在通用路线上方有此路线。

更新

我希望我的所有管理网址包含/管理/文件夹前缀,这样:

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

和非管理员都喜欢:

www.example.com/user 
www.example.com/articles 
+0

您使用的是mvc 1还是2? – 2010-01-27 17:02:49

+0

这是一个用asp.net mvc路由问题的好工具,http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx – 2010-01-27 17:05:02

+0

我正在使用mvc 1.0 – mrblah 2010-01-27 17:31:06

回答

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=""}) 
}); 

我假设管理用户控制器是一种特殊情况,你不必与/用户/启动其他控制器。如果你这样做,另一种方法是将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"}) 
}); 

这里我使用一个约束来限制这个特定的路线适用的控制器。

顺便说一下,我建议使用MapRoute扩展方法。它们减少了详细的路由注册。

+1

我想要www.example .com/admin/user和www.example.com/user工作。一个控制器是AdminUserController和UserController。这是你的回应吗?因为你的第二条路线是admin/user/{controller} ...我有很多管理员控制器,所以我不想硬编码。谢谢! – mrblah 2010-01-27 17:17:52

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

应该给你你想要的...

+0

废话...所以muuch为一个eaasy答案...我已被正式哈克... – MarkKGreenway 2010-01-27 17:11:50

+0

是不是我现在拥有? – mrblah 2010-01-27 17:14:42

+0

你有 管理员/管理员{管理员} 这意味着两个管理员之前,它开始找到控制器名称 – MarkKGreenway 2010-01-27 17:23:08

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 = "" }     
    ); 
0

每个控制器映射创建IRouteHandler的实现,将拦截请求控制器和追加“管理员”在前

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。在通过AdminRouteHandler后,默认离开Home将映射到AdminHome

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