Маршрутизация - Area Controller / View с параметром - PullRequest
1 голос
/ 03 ноября 2011

Супер простой сайт MVC с Area для работы с мобильными устройствами. Вся моя область маршрутизации работает нормально, за исключением представления, которое ожидает параметр.

На "нормальном" сайте у меня есть страница просмотра видео, которая ожидает параметр.

mysite.com / Видео / 123456

Это отлично работает. После того, как я немного боролся с этим в своем Зоне за мобильный контент, я даже начал использовать точно такой же код / ​​разметку в моем контроллере и представлении. Так что я ожидаю, что следующий URL:

mysite.com / Mobile / Видео / 123456

Решил бы правильно. Это не так. Я получаю 404 (не найден). Если я отключу параметр:

mysite.com / Mobile / Видео

Правильно разрешается.

Я уверен, что это должно быть что-то, что я делаю неправильно в маршрутизации. Ниже приведен соответствующий раздел из моего 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 ]

1 голос
/ 04 ноября 2011

SteveInTN, вы не можете иметь одинаковую регистрацию в Global.asax и MobileAreaRegistration.cs.

Вам нужно иметь только мобильную регистрацию на MobileAreaRegistration.cs и вызывать AreaRegistration.RegisterAllAreas () в Application_Start перед RegisterRoutes (RouteTable.Routes).

Если вы хотите, чтобы URL был похож на 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 }
        );
    }
0 голосов
/ 04 ноября 2011

Похоже, ваше имя маршрута не должно содержать /, поскольку оно может конфликтовать с маршрутизацией? Когда я делаю маршрутизацию, я проверяю уникальность имен и использую подчеркивание для представления разделителей, например так: text_text. Не уверен, что это сработает, хотя стоит попробовать.

...