MVC3 навигация и навигация - управлявани от данни

Видях някои публикации за навигация и галета, но не намерих точно същия проблем. Ако обаче има, моля да ме извините и да ме насочите към него. Благодаря ти.

Моят случай :

Interests                   Profiles
|                       |
|_Interest Area 1               |-Profile Area 1
|   |                       |
|   |_Interest Area 1.1             |_List of Books
|       |                       |
|       |_List of Books                 |_Book Detail
|           |
|           |_Book Detail
|_Interest Area 2
    |
    |_List of Books
        |
        |_Book Detail

Йерархията се съхранява в базата данни. Входните точки Интереси и Профили са фиксирани. От там нататък не знам какви ще са децата.

Когато вече няма останало дете, книгите се извличат въз основа на стойността на последната избрана (под)категория.

Тук имам два проблема: 1-ви: Създаване на подходящите маршрути. Начинът, по който бих искал е:

/books/{id}/{interestareaname}/{subinterestareaname}/{books}/{page}

където interestareaname се добавя за удобни за потребителя URL адреси и продължава да се повтаря, докато слизате в йерархията. Резултатът тогава ще бъде: /books/1/project-management/prince2/books/1 това показва книгите prince2 на страница 1 със списък със страници.

Но когато има само едно ниво, маршрутът съдържа само едно име на интересна област и по този начин става това:

/book/{id}/{interestareaname}/{books}/{page}

Какво направих, за да разреша проблем номер 1:

    routes.MapRoute(
        "Details",
        "view/details/{id}/{booktitle}",
        new { controller = "book", action = "Details", id = "*", booktitle= "*"});

    routes.MapRoute(
        "interests",
        "books/{id}/{level1}/{level2}/{level3}/{page}",
        new { controller = "book", action = "books", level1 = "*", level2 = "*", level3 = "*", id = "0", page = UrlParameter.Optional }
    );
    routes.MapRoute(
        "profiles",
        "books/{id}/{level1}/{level2}/{level3}/{page}",
        new { controller = "book", action = "books", level1 = "*", level2 = "*", level3 = "*", id = "0", page = UrlParameter.Optional }
    );

Стигнах до това, като казах, че трябва да се зададе максимално ниво. Това е само защото не знаех как да го направя по-динамичен.

Проблемът сега е да се прави разлика между категориите по интереси и категориите на профила. Направих това, като създадох същия маршрут, но с различно име и добавих името на маршрута в създаването на карта на сайта.

Вторият проблем, който имам, е картата на сайта и навигационните трохи. Използвам MVCsitemapprovider и функционалността DynamicNodes.

С картата на сайта имам проблем с показването на страницата с подробности. Защото книгите ще се появяват и по профили, и по интереси. И някои книги ще се появят в множество области на интереси или профили. Във всеки случай бих искал да видя пътя, по който стигнах до тази книга.

Първо добавих страниците с подробности за всяка книга към картата на сайта, но това беше лудост. И създава дублиращи се записи, които не се обработват много добре от карти на сайта. Друг вариант беше да предам данните за маршрута на страницата със списъка към страницата с подробности чрез низ на заявка, но това изглеждаше ужасно и след това трябва да добавя логика, за да анализирам низа на заявката, за да имитирам навигационния път, което ще бъде трудно, тъй като тогава имам само идентификатора от най-ниското ниво.

Прекарах много нощи и все още не мога да го разбера. Ако някой може да помогне или да ме насочи в правилната посока ще съм много благодарен.


person Mounhim    schedule 03.02.2012    source източник
comment
Маршрутите са намалени до един единствен маршрут, тъй като другите никога не са били достигнати (открито с помощта на routedebugger). Проблемът с странирането в списъка се решава с помощта на UrlParameter.Optional. Сега единственият останал проблем е показването на навигационния път, когато стигнете до страницата с подробности за книга.   -  person Mounhim    schedule 07.02.2012


Отговори (1)


Единственото решение, което намерих досега за себе си, е всъщност да създам всички възможни маршрути, като:

        routes.MapRoute(
            "interest",
            "interest",
            new { controller = "books", action = "viainterest"},
            new { controller = "books", action = "viainterest" }
        );

        routes.MapRoute(
            "interest_1_details",
            "interest/{level1}/view/{id}/{booktitle}",
            new { controller = "books", action = "detailsviainterest_1, level1 = "*", id = 0, booktitle = "*" },
            new { controller = "books", action = "detailsviainterest_1" }
        );

        routes.MapRoute(
                       "interest2details",
                       "interest/{level1}/{level2}/view/{id}/{booktitle}",
                       new { controller = "books", action = "detailsviainterest_2", level1 = "*", level2 = "*", id = 0, booktitle = "*" },
                       new { controller = "books", action = "detailsviainterest_2" }
                   );


        routes.MapRoute(
                        "interestlevel_1",
                        "interest/{id}/{level1}",
                        new { controller = "books", action = "viainterestlevel_1, level1 = "*", id = 0 },
                        new { controller = "books", action = "viainterestlevel_1"}
                    );

        routes.MapRoute(
                       "interestlevel_2",
                       "interest/{id}/{level1}/{level2}",
                       new { controller = "books", action = "viainterestlevel_2", level1 = "*", level2 = "*", id = 0 },
                       new { controller = "books", action = "viainterestlevel_2}
                   );
        //and so on for level 3 and for profiles etc.

В DynamicNodeManager добавям всички категории йерархично и също добавям всички елементи. Сега получавам приличен навигационен път чак до страницата с подробности. И тъй като пътищата (маршрутизирани данни и действия) за всяка страница с подробности са различни, дори книга, която се появява в няколко категории, показва правилния навигационен път.

Това реши проблема ми, но все още мисля, че трябва да има по-добър начин. Проблемът с текущото решение е, че дървото ще стане огромно поради детайлните елементи, които също се добавят към колекцията от възли. Другият недостатък е, че дървото се генерира при стартиране на приложението. По този начин добавянето на нова книга не създава възел, докато не нулирам уеб приложението.

Така че, ако има други предложения, ще се радвам да ги видя. Засега мога да продължа със съдържанието, за което става въпрос в крайна сметка.

person Mounhim    schedule 09.02.2012