路由 - 带参数的区域控制器/视图

时间:2011-11-03 19:46:59

标签: asp.net-mvc-3 asp.net-mvc-3-areas

超级简单的MVC网站,带有处理移动设备的区域。除了需要参数的视图外,我的所有区域路由都可以正常工作。

在“普通”网站中,我有一个需要参数的视频页面。

mysite.com/Video/123456

这完美无缺。在我的区域中针对移动内容进行了一些争论后,我甚至在Controller和View中使用了完全相同的代码/标记。所以我希望以下网址:

mysite.com/Mobile/Video/123456

会妥善解决。它没有。我得到了404(未找到)。如果我关闭参数:

mysite.com/Mobile/Video

它正确解析。

我确信这一定是我在路由中做错了。以下是我的global.asax中的相应部分。任何帮助将不胜感激。

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

        routes.MapRoute( 
            "Video", // Route name 
            "Video/{id}", // URL with parameters 
            new { controller = "Video", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
            new string[] { "mysite.Controllers.VideoController" } 
        ); 

        routes.MapRoute( 
            "NewsItem", // Route name 
            "NewsItem/{id}", // URL with parameters 
            new { controller = "NewsItem", action = "Index", id = 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 
            new string[] { "mysite.Controllers.HomeController" } 
        ); 

        routes.MapRoute( 
            "Mobile", // Route name 
            "{controller}/{action}/{id}", // URL with parameters 
            new { area = "Mobile", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
            new string[] { "mysite.Areas.Mobile.Controllers.HomeController" } 
        ); 

        routes.MapRoute( 
            "Mobile/Video", // Route name 
            "Mobile/Video/{id}", // URL with parameters 
            new { area = "Mobile", controller = "Video", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
            new string[] { "mysite.Areas.Mobile.Controllers.VideoController" } 
        ); 
    }

2 个答案:

答案 0 :(得分:1)

SteveInTN,您不能在Global.asax和MobileAreaRegistration.cs中进行相同的注册。

您只需要在MobileAreaRegistration.cs上进行移动注册,并在RegisterRoutes(RouteTable.Routes)之前在Application_Start中调用AreaRegistration.RegisterAllAreas()。

如果你想要像mysite.com/Mobile/Video/123456这样的网址: 移动路由注册的格式应为{controller} / {id},如视频路由。

在Global.asax注册:

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

    routes.MapRoute( 
        "Video", // Route name 
        "Video/{id}", // URL with parameters 
        new { controller = "Video", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
        new string[] { "mysite.Controllers.VideoController" } 
    ); 
    //newsitem route
}

在MobileAreaRegistration上注册:

public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Mobile_default",
            "Mobile/{controller}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }

答案 1 :(得分:0)

看起来您的路线名称不应包含/因为它可能与路由冲突?当我做路由时,我确保名称是唯一的,并使用下划线来表示像这样的分隔符:text_text。不确定这是否有效,值得一试。