Ambiguidade de roteamento do ASP.NET MVC Preview 5
-
09-06-2019 - |
Pergunta
Estou com um problema com um roteamento de amostra com a visualização 5 do asp.net mvc.
No AccountController tenho 2 ações:
public ActionResult Delete()
public ActionResult Delete(string username)
Ao tentar procurar por Account/Delete ou Account/Delete?username=davide o ControllerActionInvoker lança uma exceção dizendo que a solicitação de exclusão é ambígua entre meus métodos de ações de reboque.
A rota padrão no global.asax não foi alterada.
O invocador da ação não deveria entender qual é o método a ser chamado olhando na lista de parâmetros?
Usando o preview 4 não tive esse tipo de problema ao realizar a mesma operação.
Qualquer ideia?
Solução
Solução encontrada!
Com a introdução do ActionNameAttribute, agora é necessário filtrar manualmente qual método chamar dependendo da solicitação.Isso é feito pelo ActionSelectionAttribute.
Explicação completa aqui: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx
Outras dicas
Não posso dizer com certeza por que isso está acontecendo.Mas você pode querer considerar apenas a ação Delete(string username) e remover a sobrecarga sem parâmetros.
Como string é anulável, meu entendimento é que simplesmente chamar Account/Delete invocará a ação com um parâmetro de nome de usuário nulo que você pode testar no início do método de ação.
O que eu faria é abandonar o Delete() em branco e usar apenas Delete(string nome de usuário)
No seu roteamento de URL, você teria algo semelhante a "/{Controller}/{Action}/{username}/" ?Se você tiver "/{Controller}/{Action}/{Id}/" seria melhor fazer Delete(string id) e dessa forma apenas usar a url para lidar com isso "/Account/Delete/davide/"
Dito isto, use sua rota padrão, que deve ser algo como o ID padrão é ""
Então, no seu método Delete(string id) tenha:
public ActionResult Delete(string id)
{
if(string.IsNullOrEmpty(id)) return EmptyID();
// Continue normal Delete method
}
public ActionResult EmptyID()
{
// The method you were going to have on a blank delete.
}
Isso ou apenas resumir em um método if {} else {}
De qualquer forma, eu apenas usaria um método e definiria um padrão em seu nome de usuário/id em sua rota de uma string vazia e trataria dessa maneira.
Se você quiser entrar em contato comigo para acompanhar o que quero dizer, ou o que quer que possa ajudar, envie um ping para andrew@ meu domínio na minha página de informações.
Editar:Ah, basicamente o que Berko disse, não tenho certeza de como os atributos nomeados ajudariam - então, poste um comentário aqui detalhando para outros caras que encontram os mesmos problemas!:)
É ambíguo porque as duas ações do controlador são o mesmo método post.Você só pode usar isso no cenário de postagem de formulário, por exemplo, você está enviando dados de um formulário que usa postagem HTTP.