2012-04-04 3 views
7

Я в порядке с ~/mapping в Home Index и с ~/Blog сопоставлением с индексом в блоге, но как я могу предотвратить отображение ~/Home в Home Index? Я не хочу, чтобы маршруты были доступны из более чем одной конечной точки.ASP.NET MVC 3 маршрутизации: предотвращать доступ к домашней сети?

Аналогично, как я могу предотвратить доступ ко всем другим действиям «Индекс» как из ~/Controller, так и из ~/Controller/Index?

OK ~/
NO ~/Главная
NO ~/Home/Index
OK ~/AnyOtherController
NO ~/AnyOtherController/Индекс

Я предполагаю, что правило должно быть что-то вроде предотвращения любого дефолта действия, которые должны быть доступны в явном виде, а в случае дома также запрещают доступ к нему только с помощью контроллера.

Можно ли это сделать? Это было сделано в прошлом? SO, например, не делает этого (вы можете получить доступ либо к here, либо к there), и оба отображают домашнюю страницу; и они, вероятно, имеют другое название действия по умолчанию, чем «index», что, возможно, также является доступным путем.

+0

Это очень похож на вопрос, который я задал на днях: http://stackoverflow.com/questions/9974402/301-redirect-original-url-request-to-routed-url.Я не говорю, что это дубликат, поскольку я думаю, что он немного отличается, но мне было бы интересно узнать ответ на этот вопрос. – Curt

+0

Мне любопытно, почему вы не хотите, чтобы маршруты были доступны из более чем одной конечной точки. –

+0

Возможно, посмотрите на использование пакета 'AttributeRouting' из nuget, чтобы вы могли явно определять все ваши маршруты ... – dotjoe

ответ

4

Реализовано это следующим образом для того, чтобы эти маршруты следует рассматривать как 404 ошибок, но до сих пор в моем приложении MVC (для того, чтобы пользовательские ошибки просмотра иметь место):

/// <summary> 
    /// By not using .IgnoreRoute I avoid IIS taking over my custom error handling engine. 
    /// </summary> 
    internal static void RegisterRouteIgnores(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "IgnoreHome", 
      "Home", 
      new { controller = "Error", action = "NotFound" } 
     ); 

     routes.MapRoute(
      "IgnoreIndex", 
      "{controllerName}/Index/{*pathInfo}", 
      new { controller = "Error", action = "NotFound" } 
     ); 

Это позволяет доступ к Главная/Индекс действия с использованием /home/{id}, но я готов жить с этим.

+0

Спасибо за сообщение, что вы в конечном итоге использовали. –

4

Вы можете просто объявить, что маршрутизация не должна применяться к URL-адресам, которые соответствуют шаблонам. Например:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Ignore("Home/{*pathInfo}"); 
    routes.Ignore("{controller}/Index"); 
} 

URL, соответствующий этим маршрутам, то будет рассматриваться как голые страницы, которые, конечно, не будет существовать.

+1

Он, конечно же, не хочет игнорировать все другие ** Домашние ** действия, кроме ** Индекса **, поэтому первый должен быть изменен на '' Home''. –

0

Вот как я смог добиться того, что я думаю, что вы просите.

// Portal Sections 
     routes.MapRoute("Home", 
         "", 
         new { controller = "Home", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("About", 
         "about", 
         new { controller = "Home", action = "About" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Features", 
         "features", 
         new { controller = "Home", action = "Features" }, 
         new[] { "Myapp.Portal.Controllers" }); 


     routes.MapRoute("Help", 
         "help", 
         new { controller = "Help", action = "Index" }, 
         new[] { "Myapp.Portal.Controllers" }); 

     routes.MapRoute("Knowledgebase", 
         "help/kb", 
         new { controller = "Help", action = "Knowledgebase" }, 
         new[] { "Myapp.Portal.Controllers" }); 

я могу получить доступ

  • mysite.com
  • mysite.com/about
  • mysite.com/features
  • mysite.com/help
  • mysite.com/ help/kb

, но доступ не доступен для

  • mysite.com/home/about
  • mysite.com/home/features

надеюсь, что эта помощь :)

Смежные вопросы