重构我的路线更有活力

时间:2009-09-10 15:46:05

标签: asp.net-mvc routing

目前我的网址结构如下:

www.example.com/honda/ www.example.com/honda/add www.example.com/honda/29343

我有一个名为HondaController的控制器。

现在我想重构一下,这样我就能支持更多的汽车制造商。 数据库有一个表,用于存储我想要支持的所有制造商。

如何保留我的网址,但现在支持:

www.example.com/ford www.example.com/toyota/add 等

我可以轻松地将HondaController重命名为CarController,只需传入字符串'honda'或'toyota',我的控制器就可以正常工作(现在硬编码为'honda')。

这可能吗?我不确定如何根据我在数据库中的内容创建路线动态。

3 个答案:

答案 0 :(得分:3)

您的路线的任何部分都可以是动态的,只需将其变为路线参数即可。因此,而不是“/ honda / {action}”,请执行:

/{manufacturer}/{action}

这将为您提供一个名为“manufacturer”的参数,该参数已传递给您的action方法。所以你的行动方法签名现在可以是:

public ActionResult add(string manufacturer) { }

由您来验证制造商参数是否与数据库中的制造商列表正确匹配 - 最好将此列表缓存以便更快地查找。

<小时/> 更新:默认路由的“你必须取出默认参数”的意思是这个。如果你有:

route.MapRoute("Default", "/{controller}/{action}/{id}", 
                new { id = 1 }    // <-- this is the parameter default
              );

然后此路由将匹配任何具有两个段的URL,以及具有三个段的任何URL。所以“/ product / add / 1”将由此路由处理,但“/ product / add”也是如此。 如果您取出"new { id = 1 }"部分,它只会处理看起来像“/ product / add / 1”的网址。

答案 1 :(得分:1)

我为花岗岩制作了这样的东西,因为我想要一个材料控制器,但有一个这样的网址:

黑/花岗岩/台面 黑/石英/台面

我做了这条路:

routes.MapRoute("Quote", "quote/{color}/{surface}/{type}",
                        new {controller = "Quote", action = "surface"});

为汽车交换报价,所以你可以:

车/本田/协议

您的路线可以

routes.MapRoute("cars", "car/{make}/{model}",
                        new {controller = "Cars", action = "Index"});

你的actionResults可以是这样的:

public ActionResult Index(string make, string model)
    {
        //logic here to get where make and model

        return View();
    }

我认为它涵盖了它

答案 2 :(得分:0)

我推荐的是使用:

domain/m/<manufacturer>/<action>

其中'm'是制造商控制器。这将允许您为所有扩展使用相同的控制器,并在将来为您节省很多麻烦,尤其是在添加新功能时。当您想要将第一个变量(在本例中)保留为第一个感兴趣点时,通常需要使用单字母控制器。