【问题标题】:MVC 3 routing help with dynamic routeMVC 3 路由帮助动态路由
【发布时间】:2011-09-27 13:47:33
【问题描述】:

我正在尝试做这样的事情:

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

当我尝试加载第 404 页时,我认为它给了我错误, 我试图使网址看起来像这样: 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 } 
            );

谢谢。

【问题讨论】:

  • 它可能与另一条路线发生冲突。您可以发布其余的映射路线吗(按正确的顺序)

标签: asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

您的问题是 Product 路线将匹配不以 Category 或 Profile 开头的所有内容。

我会将产品路由放在默认路由之前,并使用 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 显然应该替换为您在系统中查找产品的方式。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多