MVC RouteDatas перепутаны - PullRequest
       8

MVC RouteDatas перепутаны

0 голосов
/ 06 декабря 2010

Я использую 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;
    }


}

1 Ответ

0 голосов
/ 06 декабря 2010

Надеюсь, это может помочь вам, оно покажет, какие маршруты соответствуют URL-адресам, я был немного смущен вопросом.

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

...