目前我的网址结构如下:
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')。
这可能吗?我不确定如何根据我在数据库中的内容创建路线动态。
答案 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'是制造商控制器。这将允许您为所有扩展使用相同的控制器,并在将来为您节省很多麻烦,尤其是在添加新功能时。当您想要将第一个变量(在本例中)保留为第一个感兴趣点时,通常需要使用单字母控制器。