2016-08-19 2 views
1

У меня есть сайт, который имеет в основном «площадь» для каждого арендатора. поэтому он будет отображаться как www.site.com/, и он перейдет на страницу этих групп, используя область.Маршрут арендатора по маршруту по умолчанию

У меня есть маршрут по умолчанию за пределами области, поэтому вы можете перейти на сайт www.site.com/, который приведет вас к фактической странице ~/Views/Home/Index. Однако, если вы попытаетесь ввести www.site.com/Home/Index или скажите, что страница для создания новой группы www.site.com/Group/Create, она думает, что ей нужно перейти в область, которой этого не существует, и дает ресурс 404 не найден.

Вот маршрут по умолчанию в RouteConfig.cs

 routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { "TicketSystem.Controllers" } 
     ); 

Вот маршрут конфигурации для области:

 context.MapRoute(
      "Group_default", 
      "{group}/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { "TicketSystem.Areas.Group.Controllers" }); 

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

Я думал, что может быть резерв. Поэтому, когда он пытается перейти в область и не может найти правильный контроллер/действие, он проверит следующий маршрут по умолчанию. Если он все еще не может найти что-либо, он не даст ресурс ошибки 404 не может быть найден. Хотя я точно не знаю, как это сделать.

Так, чтобы сайт www.site.com/ работал и разрешил работать на сайте www.site.com/Home/Index.

+0

Что такое 'group' значение? Это может быть только один из областей, которые у вас есть в приложении или в любой случайной строке? – Shyju

+0

@Shyju Групповое значение для области может быть любой строкой, если у нее нет пробелов. При загрузке области она проверяет, чтобы группа существовала в базе данных. Таким образом, это может быть сайт www.site.com/testgroup или www.site.com/othergroup, и они должны перейти на страницу группы фактических данных. – Insight

+0

Итак, у вас в основном есть одна область. обряд? Когда группа находится в URL-адресе, вы хотите, чтобы ее обрабатывали области? – Shyju

ответ

1

Проблема в том, что когда вы пытаетесь получить доступ /Home/Index Механизм маршрута не знает «Home», вы имели в виду имя контроллера или имя группы!

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

public class GroupNameConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, 
         RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var asm = Assembly.GetExecutingAssembly(); 

     //Get all the controller names 

     var controllerTypes = (from t in asm.GetExportedTypes() 
      where typeof(IController).IsAssignableFrom(t) 
      select t.Name.Replace("Controller", "")); 
     var groupName = values["group"]; 
     if (groupName != null) 
     { 
      if (controllerTypes.Any(x => x.Equals(groupName.ToString(), 
                 StringComparison.OrdinalIgnoreCase))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

Зарегистрировать это ограничение при регистрации маршрута вашей области.

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Group_default", 
      "{group}/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { anything = new GroupNameConstraint() } 


     ); 
    } 

Это должно работать при условии, что вы никогда не будете иметь Groupname же, как ваше имя контроллера (Ex: Home)

+1

Удивительный, который отлично работает! Я могу добавить простую проверку, чтобы убедиться, что люди не могут сделать имя группы таким же, как любое имя контроллера, не должно быть сложным. Впервые проверяя ограничения, лучший способ, которым я научился, - фактически использовать их, и теперь, когда я использую его в своем собственном контексте, все это имеет смысл сейчас. Благодаря! – Insight

+0

Для тех, кто выполняет профилирование, вы можете добавить 'if (groupName.ToString(). Equals (" VSEnterpriseHelper.axd ", StringComparison.OrdinalIgnoreCase)) {return false; } ', который позволит профилировать файл axd, чтобы он работал правильно, вместо того, чтобы думать, что это группа. Наверное, это более простой способ сделать это, но он позволяет вам знать, где проблема на самом деле происходит. Если вам нужен файл asmx или что-то еще. – Insight

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