2013-07-15 90 views
2

可选参数

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

这些路线在模式背后工作;进入的网址与模式相匹配,直到找到匹配的网址。

假设你现在谈论的不是可选的公司名称,你应该能够逃脱:

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

,然后只需确保所有方法采取company参数。但是,这会在更简单的路线上失败,因此请确保您为诸如根等页面设置了默认值。如果你最终想要的是不涉及公司的其他途径,这些也可以照顾特定控制器路线:

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

的无特定公司的人之前。

注意,你可以很容易地在.NET中使用NUnit和MvcContrib.TestHelper测试这些途径,例如:

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

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

,以确保他们将你所期望的位置。

+0

谢谢,我会试试这个。但是如果例如我想为使用当前门户且与公司无关的用户拥有domain.com/profile,这种方法是否可行?澄清:domain.com/profile - 用户可以编辑他的名字,照片等... domain.com/search - 用户可以搜索公司... domain.com/company-name-ltd/products - 用户可以查看特定公司的东西 – Vygandas

+0

你可以,但你必须有一个不同的路线在此之前定义,具有URL(类似于 - 这取决于您的实际要求)“profile/{action}”和“Profile”的默认控制器。 –

+0

我与连结http测试吧://本地主机:22621 /测试/公司/指数 现在有这两个路线: routes.MapRoute( 名称: “默认”, 网址:“{控制器}/{动作}/{id}“, 默认值:new {controller =”Home“,action =”Index“,id = UrlParameter.Optional}); 路线。MapRoute( name:“Default With Company Name”, url:“{company}/{controller}/{action}/{id}”, 默认值:new {controller =“Company”,action =“Index”, id = UrlParameter.Optional}); 我得到:无法找到资源。 – Vygandas