C# ASP.NET MVC 5动态控制器路由

C# ASP.NET MVC 5动态控制器路由,c#,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,我面临着一个挑战,即找出动态定义基于层次结构的路由的最佳方法 我希望实现类似以下内容的数据库驱动链接: /Illinois/ /Illinois/Chicago/ /Illinois/Chicago/Id /California/ /California/Los-Angeles/ /California/Los-Angeles/Id /New-York/ /New-York/New-York-City/ /New-York/New-York-City/Id 以此类推,我不想为每个州定义一个控制

我面临着一个挑战,即找出动态定义基于层次结构的路由的最佳方法

我希望实现类似以下内容的数据库驱动链接:

/Illinois/
/Illinois/Chicago/
/Illinois/Chicago/Id
/California/
/California/Los-Angeles/
/California/Los-Angeles/Id
/New-York/
/New-York/New-York-City/
/New-York/New-York-City/Id

以此类推,我不想为每个州定义一个控制器,但我不是100%反对是否“正确”。您可以创建一个类似于
HomeController的控制器,并使用此控制器顶部的路由属性和相关操作来隐藏路由url,调用路由中的位置和ID,如下所示:

[RoutePrefix("")]
public class HomeController : Controller
{
    Route("{state?}/{city?}/{id?}")
    public ActionResult Index(string state, string city, int id)
    {
        //your codes
        return View();
    }
}

除此之外,您是否还希望有像
{controller}/{action}
这样的路由,例如
/Home/Index
?因为在解析路由时,您需要点击数据库才能知道
Home
在美国不是一个州,
Index
不是一个城市。如果您的应用程序中有其他控制器,则您显示的URL的可能重复项将无法自行工作。您将需要一些识别前缀,例如
/Locations/Illinois
/Locations/California/Los Angeles/
等,然后您需要一个
位置控制器
,它只有一种方法来处理所有的问题above@DarinDimitrov-好问题,是的,我仍然需要能够使用传统的routes@StephenMuecke-业务需求确实允许我添加一个主要的控制器名称,例如/Locations/或类似的answareLooks检查true,就像我可能已经跳过了这一步一样。我在使用上述方法使用传统路线时遇到问题。有没有办法让我列出一份可接受的国家名单?我不想把所有的电话都列出来,但我可以为州和城市电话。或者,我有没有办法排除某些东西?在本例中,我发布到“/Lead”,但它在数据库中查找Lead。否则,我会得到一个错误,即“找到了多个与URL匹配的控制器类型”,我最终使用了这个路由,而且效果很好。传统路由的修复方法是使用正则表达式忽略它们。虽然不是最干净的解决方案,但也没有太多,所以它仍然运行良好。