2015-10-15 5 views
0

Когда я пытаюсь добавить ограничение маршрут по умолчанию следующим образомASP.NET MVC: По умолчанию маршрут с ограничением ид

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

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     constraints: new { id = @"\d+" } 
    ); 
} 

и работает сайт, я получаю:

HTTP Ошибка 403.14 - Запрещенная ошибка

Веб-сервер настроен так, чтобы не отображать содержимое этого каталога.

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

Является ли это своего рода ошибкой, или я не понимаю что-то важное в отношении ограничений маршрута?

Я использую .NET 4.5.2, MVC 5.2.3, VS 2015 с IIS Express 10.0.

+0

Ну, вы добавили ограничение на параметр ид, который эффективно делает идентификатор требуемого. Я думаю, вы получаете свою ошибку с URL-адресами, такими как 'yourhost /' или 'yourhost/controller/action' –

+0

@ Daniel, действительно ли это требуется? Если да, то как я могу указать, что он должен быть целым только, но не требуется? – drty

+0

Это сложная штука. Я думаю, вы могли бы определить маршрут '{controller}/{action}/{id}', где ни один из них не является необязательным, а id имеет ограничение. Затем еще один маршрут '{controller}/{action}', где оба являются необязательными и имеют значения по умолчанию Home/Index –

ответ

0

Хорошо, предположим, что у вас есть проблемы и решения, вы можете find here.

Решение адаптировано к вашей ситуации:

public class NullableConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (routeDirection == RouteDirection.IncomingRequest && parameterName == "id") 
     { 
      // If the userId param is empty (weird way of checking, I know) 
      if (values["id"] == UrlParameter.Optional) 
       return true; 

      // If the userId param is an int 
      int id; 
      if (Int32.TryParse(values["id"].ToString(), out id)) 
       return true; 
     } 

     return false; 
    } 
} 

И ваш маршрут:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      constraints: new { id = new NullableConstraint() } 
     ); 
0

не пробовал этого, Вы можете определить два пути, чтобы достичь того, что вам нужно

routes.MapRoute(
       name: "Default1", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index"}, 
       constraints: new {[email protected]"\d+"} 
      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index",id= UrlParameter.Optional }    
      ); 

Если идентификатор является недействительным он возвращается на маршрут по умолчанию.

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

  • Нет связанных вопросов^_^