다양한 유형의 링크를 생성하는 MVC ActionLink… 왜 그럴까요?
-
06-09-2019 - |
문제
저는 MVC Land를 처음 접했고 작업 중인 앱이 있습니다.내 글로벌에는 상당히 유사한 2개의 경로가 있는 2개의 다른 링크가 있습니다.
경로 1
routes.MapRoute("Category", "Movies/{category}/{subcategory}",
new { controller = "Catalog", action = "Index", category = "", subcategory = "" });
경로 2
routes.MapRoute("Movie", "Movie/{movie}",
new { controller = "Movie", action = "Index", movie = "" });
첫 번째 경로에 대한 작업링크를 호출하면 다음과 같이 생성됩니다.
.../Movies/Category/SubCategory
그러나 두 번째 링크를 만들면 다음과 같이 채워집니다.
.../Movie?movieId=ff569575-08ec-4049-93e2-901e7b0cb96a
이전에는 GUID 대신 문자열을 사용하고 있었는데 여전히 동일한 작업을 수행하고 있었습니다.
.../Movie?movieName=Snatch
내 작업링크는 다음과 같이 설정되어 있습니다
<%= Html.ActionLink(parent.Name, "Index", "Catalog",
new { category = parent.Name, subCategory = "" }, null)%>
<%= Html.ActionLink(movie.Name, "Index", "Movie",
new { movieId = movie.MovieId }, null)%>
내 앱은 여전히 작동하지만 이 동작이 이상하다고 생각했습니다.어떤 도움이라도 좋을 것입니다.
감사해요!
해결책
routes.MapRoute("Movie", "Movie/{movieId}",
new { controller = "Movie", action = "Index", movie = "" });
경로 텍스트가 mvc 링크에 제출하는 속성의 이름과 일치하지 않아야 합니까?
다른 팁
문제는 ActionLink를 호출할 때 라우팅 시스템이 두 경로 중 어떤 경로를 사용할지 파악할 수 없어 첫 번째 경로를 선택한다는 것입니다.해결책은 ActionLink 대신 RouteLink를 사용하는 것입니다.RouteLink를 사용하면 URI를 생성할 때 사용할 경로 이름을 지정할 수 있습니다.그러면 어떤 경로를 사용할지에 대한 모호함이 없습니다.ActionLink는 더 이상 사용되지 않는 것 같습니다.RouteLink 대신에 이를 사용할 이유가 없다고 생각됩니다.
그러나 사용자가 링크를 제출할 때 여전히 문제가 있을 수 있습니다.이 경우 경로 제약 조건을 사용하여 올바른 경로를 선택하도록 하세요.
Andrew는 ActionLink/RouteLink에서 사용하는 토큰과 경로 자체가 일치해야 한다는 것이 정확합니다(찬성).