Справка по маршрутизации MVC 3 с динамическим маршрутом - PullRequest
1 голос
/ 27 сентября 2011

Я пытаюсь сделать что-то вроде этого:

routes.MapRoute("Product", "{product}/{id}",
                            new
                                {
                                    action = "Product",
                                    controller = "Home",
                                    product = UrlParameter.Optional,
                                    id = UrlParameter.Optional
                                });

Это выдает ошибку, когда я пытаюсь загрузить страницу 404, я думаю, Я пытаюсь сделать URL-адрес похожим на это: www.tables.com/productName/ID. Как я могу сделать это, не добавляя слово сильного типа, как это:

routes.MapRoute("Product", "Products/{product}/{id}", ... )

остальные маршруты:

 routes.MapRoute("Product", "{product}/{id}",
                            new
                                {
                                    action = "Product",
                                    controller = "Home",
                                    product = UrlParameter.Optional,
                                    id = UrlParameter.Optional
                                });

            routes.MapRoute("Category", "Category/{category}/{template}",
                            new
                            {
                                action = "Index",
                                controller = "Category",
                                category = UrlParameter.Optional,
                                template = UrlParameter.Optional
                            });

            routes.MapRoute("Profile", "Profile/{fullName}",
                           new
                           {
                               action = "Index",
                               controller = "Profile",
                               fullName = UrlParameter.Optional
                           });


            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
            );

спасибо.

1 Ответ

1 голос
/ 27 сентября 2011

Ваша проблема в том, что маршрут продукта будет соответствовать всем, не начиная с категории или профиля.

Я бы разместил маршрут продукта непосредственно перед маршрутом по умолчанию и использовал бы IRouteConstraint, чтобы он не совпадал с другими продуктами..

Пример кода:

routes.MapRoute("Category", "Category/{category}/{template}",
                new
                {
                    action = "Index",
                    controller = "Category",
                    category = UrlParameter.Optional,
                    template = UrlParameter.Optional
                });

routes.MapRoute("Profile", "Profile/{fullName}",
               new
               {
                   action = "Index",
                   controller = "Profile",
                   fullName = UrlParameter.Optional
               });


routes.MapRoute("Product", "{product}/{id}",
                new
                    {
                        action = "Product",
                        controller = "Home",
                        product = UrlParameter.Optional,
                        id = UrlParameter.Optional
                    },
                new { product = new ProductRouteConstraint() });

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);

И ограничение маршрута:

public class ProductRouteConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (routeDirection == RouteDirection.IncomingRequest &&
                parameterName.ToLowerInvariant() == "product")
            {
                var productName = values[parameterName] as string;
                if (productName == null) 
                    return false;

                var productId = values["id"] as string;
                if (productId == null)
                    returns false;

                return ProductCatalogue.HasProductById(productId);
            }

            return false;
        }
    }

Очевидно, что ProductCatalogue следует заменить тем, что вы ищете в своей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...