1
resposta

Alternativa "correta" inconsistente com o projeto

Olá!

De acordo com a alternativa indicada como correta, o template da rota default precisa conter um /{pacienteId?} porque o método no controller recebe um argumento de mesmo nome:

IActionResult Historico(int pacienteId)

Porém, no projeto atual, o método utilizado ainda nem recebe nenhum argumento:

public IActionResult Carrinho()

Realizei um teste e validei que o código do produto continua sendo passado corretamente na rota desde que seja usado o mesmo nome tanto na rota default quanto na passagem de parâmetro adicional no Tag Helper. Por exemplo, passando id em vez de codigo:

Startup.cs:

routes.MapRoute(
    name: "default",
    template: "{controller=Pedido}/{action=Carrossel}/{id?}");

Carrossel.cshtml

<a asp-action="Carrinho" asp-route-id="@produto.Codigo" class="btn btn-success">Adicionar</a>

Imagino que o correto realmente é utilizar o mesmo nome do argumento do método (quando ele existe), para o ASP.NET Core realizar corretamente o binding. Mas como nesse caso o argumento ainda nem existe, só queria confirmar se faz sentido essa pergunta estar nessa posição no meio da aula (e também se meu entendimento está correto).

Obrigada!

1 resposta

Olá Bárbara, como vai?

Seu raciocínio está correto. A rota vai conter o nome do controller, depois a action e pode ter ou não os parâmetros que serão passados para a action.

Quanto a action Carrossel() ela não recebe nenhum parâmetro, mesmo que na rota padrão tenha o /{id?} ainda assim não terá nenhum processamento deste valor passado na URL.

Já no exercício, a action Historico(int pacienteId) mostra que fará uso do argumento pacienteId e para que a action NovoPaciente() faça sentido em receber um id, deveria ser decladara assim: IActionResult NovoPaciente(int pacienteId).

Para mais informações sobre o model binding, segue este link da documentação que mostra outros meios de atrelar um parâmetro da URL com um argumento da função.

Espero que essa explicação tenha feito sentido. Bons estudos!