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?

Foi útil?

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.

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