Я пытаюсь настроить пользовательский маршрут в 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 не так ли?
Проверьте приоритет и посмотрите, нужно ли его поднимать. – Nkosi
Можете ли вы отладить свою функцию соответствия? – devqon
Спасибо за ваши мысли, ребята, см. Мое обновление;) – pigpen