MVC3路由区域......有点混乱

时间:2012-04-10 02:15:18

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我有一个MVC3站点,有2个区域加上公共区域。我还有一个为分页项目列表指定的路由。我的Register_Routes方法如下:

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

        routes.MapRoute(
            "Paginate", // Route name
            "{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new { controller = "Home", action = "Index", itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = UrlParameter.Optional } // Parameter defaults
        );

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

    }

我注意到(并且不明白)是如果我从我的主页退出,我的登录页面的重定向看起来像

http://localhost:62695/Account/LogOn?ReturnUrl=%2fHome%2fPaginate

...登录后,我最终登录了我的主页,但网址为:

http://localhost:62695/Home/Paginate

我现在相当肯定我已经搞砸了路线图,但对我来说似乎是对的。我做错了什么?

更新 根据建议,我改变了我的路线:

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

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

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

    }

...并且主索引页确实似乎正常工作,但现在分页不会:

        return RedirectToAction("Paginate", new { itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = string.Empty });
Admin \ HomeController中的

产生URL:

http://localhost:62695/Admin/Users/Paginate?itemsPerPage=25&pageNumber=1

所以我在这里仍然做错了。

更新2 好的,这就是我按照我想要的方式工作的方式: 我的RegisterRoutes方法现在看起来像这样:

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

        routes.MapRoute(
            null,
            "{area}/{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new {area = string.Empty, controller = "Home", action="Paginate", searchString = UrlParameter.Optional } // Parameter defaults
        );

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

...但这还不足以解决路由问题。除此之外,我还需要将路线添加到我的区域注册中。我的AdminAreaRegistration看起来像这样:

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            null,
            "Admin/{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new { controller = "Home", action = "Paginate", searchString = UrlParameter.Optional } // Parameter defaults
        );

        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }

除了为我的连接更改为RedirectToRoute之外,我的网址也非常漂亮且同时工作。所有答案都有助于实现我的目标,我为所有人选择了1并选择了让我最接近路径的答案。

3 个答案:

答案 0 :(得分:2)

路线按其注册顺序进行评估。重定向由您注册的第一个路由生成,特别是因为您为所有段声明了默认值。您可能需要考虑定义更具体的路线

<强>更新 使用RedirectToRoute而不是RedirectToAction来获取所需的URL生成

RedirectToRoute("Paginate", new { itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = string.Empty });

答案 1 :(得分:1)

嗯,您返回到网址http://localhost:62695/Home/Paginate的原因是因为当您登录时返回指定的网址,即?ReturnUrl=%2fHome%2fPaginate的{​​{1}}部分。这不是您主页的URL吗?你从未指定过。

可能第一个定义也优先,不知道我在哪里听到,所以也许如果你先把默认定义放在那里就可以抓住它。

答案 2 :(得分:1)

routes.MapRoute(null, // do not name your routes, it's a "magic string"
    "{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}",
        new 
        { 
            controller = "Home", 
            action = "Index", 
            searchString = UrlParameter.Optional
        } 
    );

// instead of RedirectToAction, try RedirectToRoute, and do not use the route name
return RedirectToRoute(new 
    { 
        controller = "Home",
        area = "AreaName",
        itemsPerPage = SiteSettings.ItemsPerPage, 
        pageNumber = 1, 
        searchString = string.Empty, 
    }
);