MVC ActionLink gerando diferentes tipos de links ... por quê?
-
06-09-2019 - |
Pergunta
Eu sou novo para terra MVC, e ter um aplicativo que eu estou trabalhando. eu tenho 2 links diferentes com 2 rotas no meu global, que são bastante semelhante
Percurso 1
routes.MapRoute("Category", "Movies/{category}/{subcategory}",
new { controller = "Catalog", action = "Index", category = "", subcategory = "" });
rota 2
routes.MapRoute("Movie", "Movie/{movie}",
new { controller = "Movie", action = "Index", movie = "" });
Quando eu chamar um actionlink para a primeira rota cria-lo como eu acho que deveria:
.../Movies/Category/SubCategory
No entanto, quando eu criar o meu segundo link ele preenche-lo assim:
.../Movie?movieId=ff569575-08ec-4049-93e2-901e7b0cb96a
Eu estava usando uma string em vez de um guid antes e ainda estava fazendo o mesmo i.
.../Movie?movieName=Snatch
meus actionlinks são configurados como segue
<%= Html.ActionLink(parent.Name, "Index", "Catalog",
new { category = parent.Name, subCategory = "" }, null)%>
<%= Html.ActionLink(movie.Name, "Index", "Movie",
new { movieId = movie.MovieId }, null)%>
Meu aplicativo ainda funciona, mas eu pensei que este comportamento era estranho. qualquer ajuda seria ótimo.
Obrigado!
Solução
routes.MapRoute("Movie", "Movie/{movieId}",
new { controller = "Movie", action = "Index", movie = "" });
Caso o texto rota não coincidir com o nome da propriedade que você está enviando para o link MVC?
Outras dicas
O problema é que quando você chamar ActionLink, o sistema de roteamento não consegue descobrir qual das duas rotas para o uso, por isso escolhe a primeira. A solução é usar RouteLink vez de ActionLink. RouteLink permite que você especifique o nome da rota para uso ao gerar o URI. Então, não há ambigüidade sobre qual rota para uso. Eu acho que ActionLink é obsoleto. Não consigo pensar em nenhuma razão para usá-lo em vez de de RouteLink.
No entanto, você ainda pode ter um problema quando as ligações submete usuário. Nesse caso, o uso de rotas restrições para impor a selecção da rota correta.
Andrew está correta (up-votado) que os tokens que você usa no ActionLink / RouteLink ea rota em si deve corresponder.