2014-01-30 26 views
2

我有一個ASP.NET MVC 5網站。如何讓T4MVC使用類似「{controller}/{action}/{id}」的路線?

繼在各種博客的建議,我用T4MVC我的路由從改變:

context.MapRoute(
    name:"MyArea_default", 
    url:"MyArea/{controller}/{action}/{id}", 
    defaults:new { action = "Index", id = UrlParameter.Optional } 
); 

...到...

context.MapRoute(
    name: "MyArea_default", 
    url: "MyArea/{controller}/{action}", 
    defaults: MVC.MyArea.Orders.Index() 
); 

這種 「工作」,但我沒有奇蹟關於從網址格式中移除{id}細分受衆羣的信息。

/MyArea/Orders/Edit/1 

...到:果然,網址已經從(例如)改變

/MyArea/Orders/Edit?id=1 

我真的不是查詢字符串參數的粉絲,所以我想使用以前的表單。

我試圖把{ID}部分迴路由定義:

context.MapRoute(
    name: "MyArea_default", 
    url: "MyArea/{controller}/{action}/{id}", 
    defaults: MVC.MyArea.Orders.Index() 
); 

...但當然默認不再id提供一個默認值,因此不能正常工作。如果Index動作了一個可選的id參數,那麼我能夠做到這一點:

context.MapRoute(
    name: "MyArea_default", 
    url: "MyArea/{controller}/{action}/{id}", 
    defaults: MVC.MyArea.Orders.Index(null) // <- DEFAULT FOR ID 
); 

...但事實並非如此,所以我堅持。

另外,我很擔心現在在路由定義中指定了一個特定的控制器。在T4MVC更改之前,該路線未指定控制器。新款式現在是否意味着我需要每個控制器的路線?

回答

3

你應該看看T4MVC作爲一種打字輔助手段來避免魔法值。除此之外,一切都以同樣的方式工作,所以你沒有比以前更多地綁定到特定的控制器。

爲了解決您的問題,請嘗試:

defaults: MVC.MyArea.Orders.Index().AddRouteValue("id", UrlParameter.Optional) 
+0

啊,感謝 - 這看起來很有希望。一旦我的項目編譯完成,我會嘗試一下(現在有1000件!)。你有什麼補充我的最後一點 - 默認現在似乎指定一個以前他們沒有的控制器? –

+0

嗯,你是怎麼逃避不*以前指定控制器?通常在那裏(例如,創建一個乾淨的新MVC應用程序時)。 –

+0

終於開始嘗試這個,並且它不起作用。如果我像上面那樣更改默認值,那麼它看起來沒有任何作用(「id」仍然作爲查詢字符串參數傳遞)。如果我然後將「/ {id}」部分添加到URL模式中,則當我嘗試訪問我的「索引」時出現錯誤:「路由表中沒有路由與提供的值匹配。」 –