2013-07-15 91 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