Pergunta

Por que o seguinte Html.ActionLink ligar:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

Gere um URL com parâmetros de consulta em vez de um URL "repousante", ou seja:

http://localhost/Website/Case/Advance/1?step=Refer

Eu só tenho a rota padrão registrada, preciso de rotas adicionais que possam entender qual é o parâmetro "StepType"?

Eu tentei adicionar esta rota em depois A rota padrão:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

Mas não teve efeito. Adicionando o novo registro de rota antes da O padrão me deu um erro:

O dicionário de parâmetros contém uma entrada nula para o parâmetro 'id' do tipo não indicado 'System.int64' para métodos 'System.web.mvc.actionResult avanço (int64, site.core.steptype)' em 'site.controllers.casecontroller '. Para tornar um parâmetro opcional, seu tipo deve ser um tipo de referência ou um tipo anulável.

Foi útil?

Solução

Rota personalizada pegando demais no momento

Sua exceção diz apenas que sua rota personalizada está pegando algo que você não pretendia pegar. Portanto, se houver uma solicitação para o URL raiz do seu aplicativo:

http: // localhost/site

Sua rota personalizada o pegaria. E defina seus padrões. E ligue para o seu CaseController.Advance() ação. E é claro que faça uma exceção, porque id não está definido.

Mantenha sua rota personalizada na frente do padrão

Mas você terá que alterar sua rota personalizada ou adicionar restrições de rota para que ela realmente capte apenas as solicitações que ela deve capturar.

Mas qual mudança você deve fazer? Se haverá apenas um único controlador que precisa, do que alterá -lo para:

routes.MapRoute(
    "CaseAdvance",
    "Case/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});

Se houver um poço de outros controladores, você pode mantê -lo como foi, basta adicionar restrições:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { controller = "Case|Other" });

Se houver algum controlador, você pode fazer um requisito para que seu ID seja numérico:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { id = @"\d+" })

Nesse caso, essa rota captará apenas as solicitações que realmente têm um ID definido. Como um número de claro.

Você saberá qual se combina melhor.

Outras dicas

Sim, se não houver uma rota como "{controlador}/{action}/{id}/{step}", o método ActionLink simplesmente passará a "etapa" como um parâmetro de consulta.

Na sua rota, você especificou um parâmetro do StepType, mas sua passagem de um parâmetro chamado Etapa.

Seus nomes de parâmetros do ActionLink devem corresponder aos nomes dos parâmetros de rota ou você obterá exatamente o que está vendo.

EDIT: OK, você mudou seu código enquanto eu estava digitando esta resposta !!

Tente usar Routelink E veja se isso funciona para você.

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

Se a chamada RoutElink produzir um link válido, isso significa pelo menos que sua rota está configurada corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top