0

这是我的第一个 ASP MVC 项目,所以我不知道该怎么做。

我有一个名为 Admin 的部分,它有一个 Admin 控制器。我只是将它用于索引页面。

在管理部分,有不同的部分。假设公司和业务线

我想为他们自己的 CompanyController 和 LineOfBusinessController 中的人处理所有事情

我希望路由以 Admin 为前缀,即。管理员/公司,管理员/公司/添加

我通过在默认路由之前添加一个路由来实现这一点

routes.MapRoute(
            name: "Admin",
            url: "Admin/{controller}/{action}/{id}",
            defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional }
        );

现在的问题是我所有的路由都选择了这个而不是默认的,这意味着其他所有的都变成了 Admin/Section 即 Admin/Home 等等.....

我尝试使用 Html.RouteLink 而不是 ActionLink 并且 URL 的格式正确,但是当我转到 Admin/Company 时它找不到,因为它假定 Company 在 AdminController

我怎样才能正确路由呢?

编辑

这是我的路线,然后是我的链接

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        routes.MapRoute(
            name: "Admin",
            url: "Admin/{controller}/{action}/{id}",
            defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );            
    }

链接

<li>@Html.ActionLink("Home", "Index", new { controller = "Home" }, ViewBag.SelectedNav == "Home" ? new { @class = "active" } : null)</li>

链接结束 /Admin/Home

更新

由于我最终探索并最终使用了区域,因此没有在此处标记答案。在一个答案中提出了建议,但其余答案不正确,因此我不想误导任何人。感谢您的区域建议

4

2 回答 2

0

在您的特定路由下方有通用路由。路由定义的顺序很重要。当 MVC 为请求找到匹配的路由时,它不会处理其余的。

routes.MapRoute(
            name: "Admin",
            url: "Admin/{controller}/{action}/{id}",
            defaults: new { controller = "Admin", action = "Index", 
                                               id = UrlParameter.Optional }
        );

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index",
                       id = UrlParameter.Optional } // Parameter defaults
);

此外,在这种情况下,您最好使用区域。当您想将应用程序构建到不同的部分(如管理员/普通用户等)时,这是一种更好的方法。

于 2012-08-17T14:23:17.343 回答
0

因为我不知道链接行为应该是什么,所以我建议的最好方法是调试您的路由并查看哪个路由正在处理哪个 URL。

1) 进入 Visual Studio 并安装RouteDebugger

PM> Install-Package routedebugger

2) 将一些代码添加到您的全局文件中

protected void Application_Start(object sender, EventArgs e)
{
  RegisterRoutes(RouteTable.Routes);
  RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}

3) 运行您的网站并请求您有问题的链接。

4) 检查您的结果并进行相应修改


编辑:看起来好像RouteDebugger v2现在是RouteMagic

PM> 安装包RouteMagic

你可以在github上找到源代码

于 2012-08-17T14:45:29.690 回答