Я использую asp.net mvc для своего проекта на сайте.Я думаю, что у меня есть неправильные вещи в моей Routedata, но я не уверен, что это неправильно или хорошо.Я объясню ситуацию.Я кеширую результаты своих действий (вывод html) в Cache с помощью сгенерированного ключа
public static string GetKeyFromActionExecutingContext(ControllerContext filterContext)
{
StringBuilder keyBuilder = new StringBuilder();
if (filterContext.IsChildAction)
keyBuilder.Append("C-");
else
keyBuilder.Append("P-");
foreach (var item in filterContext.RouteData.Values)
{
keyBuilder.AppendFormat("{0}={1}.", item.Key, item.Value);
}
return keyBuilder.ToString();
}
, например: Для HomePage сгенерированный ключ кэша - P-Controller = Home.Action = Index и
У меня также есть дочерние действия в моем владельце сайта, такие как LoginBox (он находится в MembershipController / LoginBox). Его ключом кеша является C-Controller = Membership.Action = LoginBox.
До сих пор все в порядке.
Iесть также подкатегории на моем веб-сайте, такие как домен / категория1 домен / категория1 / подкатегория1 домен / категория1 / подкатегория2 домен / категория2
Когда я просматриваю подкатегорию из домена / категории1, мои сгенерированные ключи не удаются, потому что мои Routedatas неверны
filterContext.RouteData.Values: Контроллер = Действие членства = LoginBox ctg1 = category1 ctg2 = "" ctg3 = ""
Почему они смешаны.Он использует отображение маршрута "Category", но я думаю, что он должен использовать отображение маршрута "Default".
Мой global.asax, как показано ниже
routes.MapRoute(
"Category",
"{ctg0}/{ctg1}/{ctg2}/{ctg3}",
new
{
controller = "Category",
action = "Index",
ctg0 = "",
ctg1 = "",
ctg2 = "",
ctg3 = ""
},
new
{
ctg0 = new CategoryRouteConstraint(),
}
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" },
new { controller = @"[^\.]*" }
);
Также мой метод CategoryRouteConstraint проверяет из db, чтоЗначение ctg0 является именем категории
public class CategoryRouteConstraint : IRouteConstraint
{
public Boolean Match(
HttpContextBase httpContext,
Route route,
String sParameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
if ((routeDirection == RouteDirection.IncomingRequest))
{
if (values["ctg0"] != null && !string.IsNullOrEmpty(values["ctg0"].ToString()))
return Category.IsRoutingForCategory(values["ctg0"].ToString());
return false;
}
return false;
}
}