ASP.NET MVC não consegue encontrar rota programaticamente
-
07-07-2019 - |
Pergunta
Eu tenho a seguinte rota, registrado no meu global.
routes.MapRoute(
"Home", // Unique name
"", // Root url
new { controller = "Home", action = "Index",
tag = string.Empty, page = 1 }
);
kewl. quando eu iniciar o site, ele corretamente pega essa rota.
Agora, quando eu tento fazer programaticamente o seguinte, ele retorna NULL.
var pageLinkValueDictionary =
new RouteValueDictionar(linkWithoutPageValuesDictionary)
{{"page", 2}};
VirtualPathData virtualPathData =
RouteTable.Routes.GetVirtualPath(viewContext, "Home"
pageLinkValueDictionary);
// NOTE: pageLinkValueDictionary ==
// Key: Action, Value: Index; Key: page, Value: 2
Por que isso estar acontecendo?
Eu estava sob a impressão de que iria encontrar o caminho de casa, mas acrescentar qualquer valor não encontrado como itens de seqüência de consulta?
Atualização
Ainda sem sorte com isso. Além disso, usando o MVC RC , agora eu preciso mudar a ViewContext para veiwContext.RequestContext .. que compila mas ainda estou recebendo um resultado nulo.
Update 2
Quando eu tiver a rota sem o item padrão page=1
, a rota É ENCONTRADA .
por exemplo.
routes.MapRoute(
"Home",
"",
new { controller = "Post", action = "Index", tags = string.Empty }
);
.. e RouteTable.Routes.GetVirtualPath
retorna uma instância VirtualPathData
. Quando eu adiciono o page=1
(valor padrão) de volta, a instância VirtualPathData
retornado é nulo?
Solução
Bem, a razão que retorna nulo é porque não há nenhuma rota com uma "página" de dados de rota.
Você poderia expandir um pouco sobre o que você está tentando alcançar? Se você quer redirecionar para uma página com a URL / page / 2 ou / page = 2, então você deve estar usando RedirectToRoute ou RedirectToAction:?
return RedirectToRoute("IndexDefault", new {page = "2"});
Outras dicas
Eu acho que o seu percurso deve ser assim:
route.MapRoute("theRoute", "{controller}/{action}/{tag}/{page}",
new { controller="Post", action="Index", tag="", page=1 });
ou (dependendo do que o URL completo deve ser semelhante) ...
route.MapRoute("theRoute", "/{tag}/{page}",
new { controller="Post", action="Index", tag="", page=1 });
Esta continua a corresponder a um pedido para http://mysite.com/ e vá para seus valores rota padrão definido acima. Mas agora, quando você especificar um tag ou página, você terá a URL que você queria.
Você deve verificar se Route Tester de Phil: