【问题标题】:My route is not firing, should this work?我的路线没有触发,这应该有效吗?
【发布时间】:2010-01-27 17:00:44
【问题描述】:

我为我的行政区域创建了一条特殊路线。我这样做是为了让我的网址看起来更干净,并且避免了我有 2 个同名控制器的问题。

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

我不想要这样的 URL:

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

【问题讨论】:

标签: c# asp.net-mvc routes


【解决方案1】:

不,这行不通。

请记住,我们将“Controller”附加到为 {controller} 传入的 URL 部分。因此,在那里可以使用的 URL 是:

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

在这里,我使用约束来限制此特定路由适用于哪些控制器。

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

【讨论】:

  • 我希望 www.example.com/admin/user 和 www.example.com/user 工作。一种控制器是 AdminUserController 和 UserController。你也是这么回答的吗?因为您的第二条路线是 admin/user/{controller}... 我有很多管理控制器,所以我不想硬编码。谢谢!
【解决方案2】:
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

应该给你你想要的……

【讨论】:

  • 你有 admin/Admin{controller} 这意味着在它开始查找控制器名称之前有两个管理员
  • 嗯,但我想要一个 UserController 和一个 AdminUserController(我也会有其他 AdminXXXController)。
  • 你想让所有的管理控制器启动 /admin/ ??
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    创建一个 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 默认会在通过AdminRouteHandler 后映射到AdminHome

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-09
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2013-07-09
      • 2012-08-11
      相关资源
      最近更新 更多