Задать вопрос
@deniskutovskiy
Новичок в ASP.Net MVC

Как правильно настроить URL в ASP.Net MVС?

Здравствуйте! В asp разбираюсь третью неделю. Все вроде понятно, только не могу понять логику настройки маршрутизации и отображения URL. Интересная задача встала передо мной.
Есть контроллер ProductListController. В нем есть действие Index с фильтрацией категорий по средству get (то есть при выставленном фильтре адресная строка выглядит так: localhost/ProductList/?category=2).

Отсюда первый вопрос: как привести адресную строку к виду: localhost/ProductList/notebook (notebook соответствует второй категории в списке категорий, к которым может относиться продукт)?

Кроме того в представлении Index по каждому продукту списка можно осуществить клик, чтобы перейти на страницу продукта (действие Product, в случае с первым продуктом списка соответствующее адресу: localhost/ProductList/Product/1)

Вопрос №2: Есть ли возможность привести URL на странице продукта к виду localhost/ProductList/notebook/1, а затем к localhost/ProductList/notebook/[ЧПУ_ноутбука] (ЧПУ находится в БД и находится по id)?

Из мануалов догадываюсь, что это все настраивается в RouteConfig, но я правда пока не совсем понимаю логику этой системы (ну кроме самых азов). Так что прошу, в случае, если задача реализуема, описать решение чуть подробнее.
  • Вопрос задан
  • 559 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
wkololo_4ever
@wkololo_4ever
1)

localhost/ProductList/Product/1

routes.MapRoute(
            "Product",                                         
            "ProductList/Product/{productId}",                           
            new { controller = "ProductList", action = "Product"}
        );

В контроллере "ProductList" создаете метод "Product", который принимает параметр "productId". В него MVC замапит переданный id продукта из урл localhost/ProductList/Product/{productId}.

localhost/ProductList/notebook

routes.MapRoute(
            "ProductList",                                         
            "ProductList/{categoryName}",                           
            new { controller = "ProductList", action = "Category",}  
        );


В контроллере "ProductList" создаете метод "Category", который принимает параметр "categoryName". В него MVC замапит переданный название категории из урл localhost/ProductList/{categoryName}.

2)
Есть ли возможность привести URL на странице продукта к виду localhost/ProductList/notebook/1, а затем к localhost/ProductList/notebook/[ЧПУ_ноутбука] (ЧПУ находится в БД и находится по id)?


localhost/ProductList/notebook/1

routes.MapRoute(
            "ProductFromId",                                         
            "ProductList/Product/{categoryName}/{productId}",                           
            new { controller = "ProductList", action = "Product"},
            new {productId = @"\d+" }
        );

Тут "new {productId = @"\d+" }" выступает в роли ограничения, что id может быть только числом.

localhost/ProductList/notebook/[ЧПУ_ноутбука]


routes.MapRoute(
            "ProductFromName",                                         
            "ProductList/Product/{categoryName}/{productName}",                           
            new { controller = "ProductList", action = "ProductFromName"}
        );


Можно совместить роуты, и определять на стороне контроллера что пришло, название продукта или id.
PS. Роуты нужно определять начиная с самого строгого. Иначе запросы будут мапится не на те роуты.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
Да, все решается в RouteConfig. localhost - придаток, о котором надо забыть. для первой задачи нужен рут c шаблоном просто ProductList -
routes.MapRoute(
            "ProductList",                                              // Route name 
            "ProductList",                           // URL with parameters 
            new { controller = "ProductList", action = "Index", id = UrlParametr.Optional }  // Parameter defaults
        );

Для второй задачки рут будет похитрее
routes.MapRoute(
"ProductListSpecial", // Route name
"ProductList/{Product}/{ProductId}", // URL with parameters
new { controller = "ProductList", action = "Index" } // Parameter defaults
);

Примерно так. Разбирайтесь дальше в общем.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы