2016-11-24 1 views
0

Я пытаюсь настроить пользовательский маршрут в Orchard CMS с целью уловить имена пользователей в URL-адресе, чтобы они могли просматривать их профиль на интерфейсе; В настоящее время их профиль доступен через:Ограничение пользовательского маршрута в Orchard CMS не работает

http://localhost:30321/OrchardLocal/Orc/Profile?username=Terry

То, что я хотел бы повторить то, что почти все сайты делают, и то есть, имеют такую ​​страницу, доступную только через:

http://localhost:30321/OrchardLocal/Orc/Profile/Terry

Мои код:

using System.Collections.Generic; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using Orchard; 
using Orchard.Mvc.Routes; 
using Orchard.Security; 

namespace PP.Orc.Routes 
{ 
public class ProfileRoutes : IRouteProvider { 
    private static readonly IMembershipService _membershipService; 
    private static readonly IOrchardServices _orchardServices; 

    public void GetRoutes(ICollection<RouteDescriptor> routes) { 
     foreach (var routeDescriptor in GetRoutes()) 
      routes.Add(routeDescriptor); 
    } 

    public IEnumerable<RouteDescriptor> GetRoutes() { 
     return new[] { 

      new RouteDescriptor { 
       Priority = 5, 
       Route = new Route(
        "Profile/{username}", 
        new RouteValueDictionary { 
         {"area", "PP.Orc"}, 
         {"controller", "Profile"}, 
         {"action", "Index"}, 
         //{"username", new UserNameConstraint() }//UrlParameter.Optional } 
        }, 
        new RouteValueDictionary { 
         {"username", new UserNameConstraint()} 
        }, 
        new RouteValueDictionary { 
         {"area", "PP.Orc"} 
        }, 
        new MvcRouteHandler()) 

      } 
     }; 
    } 

    public class UserNameConstraint : IRouteConstraint 
    { 
     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      // Get the username from the url 
      var username = values["username"].ToString().ToLower(); 
      // Check for a match (assumes case insensitive) 
      IUser user = _membershipService.GetUser(username); 

      if (user == null || !_orchardServices.Authorizer.Authorize(Permissions.ViewProfiles, user, null)) 
      { 
       return false; 
      } 

      return true; 
     } 
    } 
} 
} 

Однако при попытке нужного адреса - все я получаю это:

Ошибка сервера в приложении «/ OrchardLocal». Ресурс не найден.

Очевидно, что мне не хватает какого-либо элемента, о котором я не знаю или не понимаю, как правильно реализовать маршрут в первую очередь?


UPDATE

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

В основном, добавление PP/Профиль/{имя пользователя} делает действующий ...

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

  new RouteDescriptor { 
       Priority = 7, 
       Route = new Route(
        "Profile/Register", 
        new RouteValueDictionary { 
         {"area", "PP.Orc"}, 
         {"controller", "Profile"}, 
         {"action", "Register"} 
        }, 
        new RouteValueDictionary(), 
        new RouteValueDictionary { 
         {"area", "PP.Orc"} 
        }, 
        new MvcRouteHandler()) 
      }, 
      new RouteDescriptor { 
       Priority = 6, 
       Route = new Route(
        "Profile/Edit", 
        new RouteValueDictionary { 
         {"area", "PP.Orc"}, 
         {"controller", "Profile"}, 
         {"action", "Edit"} 
        }, 
        new RouteValueDictionary(), 
        new RouteValueDictionary { 
         {"area", "PP.Orc"} 
        }, 
        new MvcRouteHandler()) 

      }, 

... так что я не знаю, почему они работают без «PP», но дескриптор USERNAME не так ли?

+0

Проверьте приоритет и посмотрите, нужно ли его поднимать. – Nkosi

+0

Можете ли вы отладить свою функцию соответствия? – devqon

+0

Спасибо за ваши мысли, ребята, см. Мое обновление;) – pigpen

ответ

0

Если вы ставите профиль/{имя пользователя}, будет с? caracter, как и в первом случае, попробуйте положить профиль/имя пользователя

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