8

我想指定我的路由表,使它们感觉更“自然”

/产品
/产品/17
/产品/编辑/17
/产品/创建

接近默认配置,但“索引”操作将映射到控制器名称的倍数形式,而“详细信息”操作将直接映射到控制器名称后面的项目 id。

我知道我可以通过显式定义这样的特殊路由映射来实现这一点:

routes.MapRoute(
    "ProductsList",
    "Products",
    new { controller = "Product", action = "Index" }
);
routes.MapRoute(
    "ProductDetails",
    "Product/{id}",
    new { controller = "Product", action = "Details" }
);

/*
 * Ditto for all other controllers
 */

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

上面的代码对我的口味来说太冗长了,并且缺点是每个控制器都需要至少提及两次才能普遍应用此 url 模式。

有什么方法可以概括这一点,还是在这种情况下我必须从事体力劳动?

4

1 回答 1

2

你可以尝试这样的事情:

routes.MapRoute(
                "ProductsList",
                "{pluralizedControllerName}",
                new { controller = "Home", action = "Index" },
                new { pluralizedControllerName = new PluralConstraint() }
                );

            routes.MapRoute(
                "ProductDetails",
                "{controller}/{id}",
                new { controller = "Home", action = "Details" },
                new { id = @"\d+" }
            );

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

请注意第二条路线中的约束,它确保第二条路线/Product/Create不会选择它,以便将其映射为第三条路线。

对于路由测试,您可以使用routedebugger,对于为路由编写单元测试,请尝试MvcContrib-TestHelper。您可以使用 NuGet 获得两者。

编辑:

您可以使用这个简单的复数形式,然后实现如下所示:

public class PluralConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            List<string> names = GetControllerNames();//get all controller names from executing assembly
            names.ForEach(n => n.Pluralize(n));
            return names.Contains(values[parameterName]);
        }
    }
于 2011-02-16T14:59:35.370 回答