2013-08-22 18 views
0

這是我設立的一個例子:只有一個動作,我可以製作一條沒有動作的路線嗎?

public class UserController : Controller 
{ 
    public ActionResult Index(int? id) { ... } 

    [HttpPost] 
    public ActionResult DoSomething(int id) { ... } 

    public ActionResult Search([params]) { ... } 
} 

,我希望能夠通過這些途徑來訪問它們:

/app/User/{id} 
/app/User/DoSomething/{id} 
/app/User/Search/ 

我試圖建立這樣我的路線,但後來如果我嘗試導航到/app/User/Search/或發佈到/app/User/DoSomething/,Index而不是命中操作。

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

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

我該怎麼做?我認爲在上面的UserWithoutIndex路由之前,只需在自己的路由中指定每個特定的操作即可,但我有多個操作,而且我不想爲控制器中的每個操作創建特定的路由。

回答

1

問題是您的第一條路線將匹配包含您提供的示例的任何兩段網址; /app/User/Search//app/User/DoSomething/以及值SearchDoSomething將分別放置在id佔位符中。然後因爲第一條路線正在匹配,您正在收到Index的行動。如果您id將採取一些格式具體情況,你可以在第一路爲它指定一個約束,像這樣:

routes.MapRoute(
     name: "UserWithoutIndex", 
     url: "User/{id}", 
     defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }, 
     constraints: new { id = "your regex here" } 
    ); 

如果約束可以有足夠具體到id比之類的東西SearchDoSomething韓元的格式不匹配,路線不匹配,所以下一條路線將被嘗試。

另外,如果總是會有在你想要的第一條路線進行有針對性的,你應該刪除id = UrlParameter.Optional默認,這樣的方式id將被要求和路線將只匹配雙片段網址的情況下指定的id因爲現在id是可選的,所以路由也將匹配單段URL。

+0

所以我可以只將格式約束只接受一個數字,對吧? – xdumaine

+0

是的,你應該可以做到這一點。 – asymptoticFault

+0

使用類似這樣的方法來匹配一個或多個數字'@「\ d +」'。 – asymptoticFault

相關問題