自定义MVC路由

时间:2015-02-27 13:07:52

标签: c# asp.net-mvc routes

所以我刚开始使用我的第一个大型MVC应用程序并且让我头疼。

所有/Category/Subcategory都转到ProductController.Index(string category, string subcategory)。如果我没有指定子类别,它将显示类别中的所有项目(福特,奥迪等)

如果我有这样的路线,则网址/Home/About会转到Product/Index,参数为:Category=Home, Subcategory=About

如果我将默认设置移到顶部,则网址/Car/Ford不会去任何地方,因为我没有CarController(我不想为每个类别设置控制器。)

我真的不喜欢/ store / Car / Ford ..

我是否需要为每个“主”类别创建一个路由并对该名称进行硬编码? 帮我解决这个问题!

// http://localhost/Car/Ford (note: Car can be replaced by bike, plan, boat etc.)
routes.MapRoute(
    name: "AllProductsInCategoryOrSubcategory",
    url: "{category}/{subcategory}",
    defaults: new { controller = "Products", action = "Index", subcategory = UrlParameter.Optional }
);

// http://localhost/Car/Ford/ABC123/Explorer
// http://localhost/Car/Ford/ABC123
routes.MapRoute(
    name: "Kakel",
    url: "{category}/{subcategory}/{id}/{productName}",
    defaults: new { controller = "Products", action = "Details", productName = UrlParameter.Optional }
);

// http://localhost/Home/About
// http://localhost/Products/RenderImage/ABC123 (used to render image in details view)
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

1 个答案:

答案 0 :(得分:0)

您可以使用路径约束来解决此问题。假设你的第一条路线 AllProductsInCategoryOrSubcategory 你可以添加这样的约束。我在这里使用你只有一个类别,这是汽车。

routes.MapRoute(
    name: "AllProductsInCategoryOrSubcategory",
    url: "{category}/{subcategory}",
    defaults: new { controller = "Products", action = "Index", 
                     subcategory = UrlParameter.Optional },
    new {category = "^car$"}
);

由于此路线限制,当类别名称为 car 时,MVC将选择此路线。 一个重点是您需要在路径约束之前添加默认值。因为在选择路线时MVC将首先选择默认值,然后将应用约束。