2008-10-26 80 views
4

我有一個路線ActionLink的不是工作,但RouteUrl確實

// Sample URL: /Fixtures/Team/id 
routes.MapRoute(
    "Fixtures-by-TeamID", 
    "Fixtures/Team/{teamId}", 
    new { controller = "Fixtures", action = "GetByTeamID", }, 
    new { teamId = @"\d{1,3}" } 
); 

,我試圖在ASP.net MVC P5使用ActionLink的。

<%= Html.ActionLink(g.HomeTeam.TeamName, "Team", new { teamId = g.HomeTeam.TeamID })%> 

但是它不工作,並給我

<a href="/Fixtures/Team?teamId=118">Team A</a> 

如果我使用Url.RouteUrl我得到正確的鏈接。

<a href="<%=Url.RouteUrl("Fixtures-by-TeamID", new { teamId = g.HomeTeam.TeamID })%>"><%=g.HomeTeam.TeamName%></a> 

<a href="/Fixtures/Team/118">Team A</a> 

任何幫助將是偉大的?這將改變ASP.net MVC測試版嗎?

感謝

唐納德

回答

1

以我的經驗,唯一的一次行動路線真的正常工作是當你只有單一的默認路由。只要你開始添加像你上面的自定義路線,行動路線變成......我猜「finicky」是正確的詞。匹配系統無法完全按照您預期的方式工作。

在這種情況下,你說的行爲是「團隊」,但是這條路線與「團隊」的行爲不匹配,它只匹配「GetTeamByID」。因此,路由系統繼續前進,並最終爲您提供基於默認路由的路由。 teamId並不是你的默認路由的一部分,所以它最終作爲一個查詢參數結束。

MVC Beta已發貨,並且此行爲不變。

另外,你不覺得指定的路線更清晰嗎?我個人認爲。

我甚至走一步,實際上我所有的定製路線,這可能看起來像這樣在當前的例子創建路線助手:

<a href="<%= Url.FixturesByTeam(g.HomeTeam.TeamID) %>"><%= g.HomeTeam.TeamName %></a> 

甚至:

<%= Html.LinkToFixturesByTeam(g.HomeTeam) %> 

,你可以直接從模型中獲取名稱和ID的值。

1

試試這個:

// Sample URL: /Fixtures/Team/id 
routes.MapRoute(
    "Fixtures-by-TeamID", 
    "Fixtures/Team/{teamId}", 
    new { controller = "Fixtures", action = "Team", teamId = -1 } 
); 

控制器應該是這樣的:

public class FixturesController : BaseController // or whatever 
{ 
    /*...*/ 
    public ActionResult Team(int teamId) 
    { 
    return View("Detail", Team.GetTeamById(teamId)) // or whatever 
    } 
    /*...*/ 
} 

而且你的鏈接看起來像

<%= Html.ActionLink("Click here for the team details", "Team", "Fixtures", new { teamId = ViewModel.Data.Id /*orwhateverlol*/ }) %> 

(我沒有MVC這臺機器上所以這全部來自內存;可能有語法錯誤或反轉一些參數)。

請注意您的路線圖的路徑匹配您的1)控制器,2)動作3)參數名稱。我發現默認動作(MapRoute中的第三個參數)有效,而您從未見過的那種方法的重載(可能是前一版本的延期)。

還要觀察FixturesController如何匹配路徑(Fixtures)和動作名稱匹配(Team),以及參數是否匹配(teamId)。

最後,您的ActionLink的最後一個參數必須與名稱(teamId)和類型中的控制器參數相匹配。

在這一點上它有點「神奇」(有很多字符串比較在後臺進行!)。希望這會隨着時間的推移而改善。舊的表現風格要好得多。你基本上稱之爲你希望運行的方法,以及你希望通過的值。我希望他們能夠將這種表達風格帶回到框架中。哈克?

+0

「表現風格」在幕後產生了相同的魔法字符串,並帶有相同的關聯匹配問題。是否「更好」是品味的問題;個人而言,我發現模擬一個動作方法的調用只是爲了得到它的名字是令人震驚的。 – 2008-10-26 19:11:46

0

當一個參數(在本例中爲「action」)僅在默認值中定義,而不在路徑url中定義時,它必須是完全匹配的(除非強制它違背RouteUrl案例中的特定路線)。

,使一切工作的是現在,你可以另一條路線添加到列表中只是上面的路線如下:

routes.MapRoute( 「燈具按TeamID1」, 「賽程/團隊/ {teamId}「, new {controller =」Fixtures「,action =」Team「,}, new {teamId = @」\ d {1,3}「} );

,或者你可以動作參數添加到路由URL,

或像你一樣,你可以使用指定的路線。

1

你試過這個嗎?

Html.ActionLink<FixturesController>(c => c.GetByTeamID(g.HomeTeam.TeamID), "Team") 

而且

您可能要行動= 「GetByTeamID」 添加到您的約束。