Маршрутизация в ASP.NET MVC 2.0 - PullRequest
3 голосов
/ 04 июня 2010

Я ищу очень простой маршрут на моем веб-сайте ASP.NET MVC 2.0. Я искал помощь, но все примеры, которые я могу найти, относятся к действительно сложной маршрутизации.

По сути, я хочу, чтобы все страницы в моем Home Controller разрешались после домена, а не / Home /

Например, я хочу http://www.MyWebsite.com/Home/LandingPage/

Стать http://www.MyWebsite.com/LandingPage/

Но только для контроллера Home, я хочу, чтобы остальные мои контроллеры работали как обычно.

Я думал о том, чтобы создать контроллер для каждого и просто использовать индекс, но нам нужно много целевых страниц для нашего маркетинга, как это, и это быстро сделает сайт загруженным контроллерами для одной страницы каждая, что не идеально .

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Один из способов сделать это - создать отдельный маршрут для каждой целевой страницы. Другой способ - создать один маршрут с ограничением, соответствующим каждой целевой странице (и ничем иным).

 routes.MapRoute(
        "LandingPage1"
        "landingpage1/{id}",
        new { controller = "home", action = "landingpage", id = UrlParameter.Optional } );

 routes.MapRoute(
        "LandingPage2"
        "landingpage2/{id}",
        new { controller = "home", action = "landingpage2", id = UrlParameter.Optional } );

Обратите внимание, что вы, вероятно, могли бы сделать это и с небольшим количеством размышлений (не проверено).

 foreach (var method on typeof(HomeController).GetMethods())
 {
      if (method.ReturnType.IsInstanceOf(typeof(ActionResult)))
      {
          routes.MapRoute(
               method.Name,
               method.Name + "/{id}",
               new { controller = "home", action = method.Name, id = UrlParameter.Optional } );
      }
 }

Решение RouteConstraint будет аналогичным, за исключением того, что у вас будет один маршрут с настраиваемым ограничением, который оценивает, соответствует ли соответствующее значение маршрута одному из методов HomeController, и, если так, заменяет контроллер и действие на «home "и соответствующее значение.

routes.MapRoute(
     "LandingPage",
     "{action}/{id}",
     new { controller = "home", action = "index", id = UrlParameter.Optional },
     new LandingPageRouteConstraint()
);


public LandingPageRouteContstraint : IRouteConstraint
{
    public bool Match
        (
            HttpContextBase httpContext, 
            Route route, 
            string parameterName, 
            RouteValueDictionary values, 
            RouteDirection routeDirection
        )
    {
        // simplistic, you'd also likely need to check that it has the correct return
        // type, ...
        return typeof(HomeController).GetMethod( values.Values["action"] ) != null;
    }
}

Обратите внимание, что механизм маршрутизации на страницу, даже если вы используете отражение, выполняется только один раз. С этого момента вы каждый раз делаете простой поиск. Механизм RouteConstraint будет использовать отражение каждый раз, чтобы увидеть, совпадает ли маршрут (если он не кэширует результаты, что я не думаю, что он делает).

0 голосов
/ 04 июня 2010

Я думаю, что вы пропустили маршрут по умолчанию.

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

Итак, при вводе www.mywebsite.com параметры контроллера, действия и идентификатора будут иметь следующие значения:

controller : Home    
action: Index    
id : ""
...