.net route开头的可选参数

时间:2013-07-15 11:41:16

标签: c# .net asp.net-mvc-4 configuration routes

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

我想让我的网址允许在开头输入公司名称,例如:

url: "{company}/{controller}/{action}/{id}"

所以我可以浏览页面,现在基础是一些公司。

  • domain.com/company-ltd
  • domain.com/company-ltd/products
  • domain.com/company-ltd/edit
  • domain.com/some-other-company-name-ltd/products

等等。

我怎么能实现这个目标?感谢。

1 个答案:

答案 0 :(得分:0)

路线在模式背后起作用;进入的URL与模式匹配,直到找到匹配的模式。

假设您不是在谈论可选的公司名称,那么您应该可以逃脱:

  routes.MapRoute(
        name: "Default With company",
        url: "{company}/{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional
  );

然后只需确保所有方法都采用company参数。但是,这会在更简单的路由上失败,因此请确保为诸如root之类的页面设置默认值。如果您最终想要不涉及公司的其他路线,那么也可以使用特定于控制器的路线来满足这些路线:

  routes.MapRoute(
        name: "Profile",
        url: "profile/{action}/{id}",
        defaults: new { controller = "Profile", action = "Index", id = UrlParameter.Optional
  );

在不太具体的公司之前。

请注意,您可以使用NUnit和MvcContrib.TestHelper在.net中轻松测试这些路由,例如:

"~/company/".WithMethod(HttpVerbs.Get)
            .ShouldMapTo<Controller.HomeController>(x => 
                  x.Index("company"));

"~/company/products/".WithMethod(HttpVerbs.Get)
            .ShouldMapTo<Controller.ProductsController>(x => 
                  x.Index("company"));

确保他们前往您期望的位置。