Domanda

Ho un problema con un routing di esempio con l'anteprima 5 di asp.net mvc.

Nell'AccountController ho 2 azioni:

public ActionResult Delete()  
public ActionResult Delete(string username)

Durante il tentativo di cercare Account/Delete o Account/Delete?username=davide ControllerActionInvoker genera un'eccezione dicendo che la richiesta Elimina è ambigua tra i miei metodi di due azioni.

Il percorso predefinito in global.asax non è stato modificato.

L'invocatore dell'azione non dovrebbe capire qual è il metodo per chiamare guardando l'elenco dei parametri?

Utilizzando l'anteprima 4 non ho avuto questo tipo di problemi nell'eseguire la stessa operazione.

Qualche idea?

È stato utile?

Soluzione

Soluzione trovata!

Con l'introduzione di ActionNameAttribute, è ora necessario filtrare manualmente quale metodo chiamare a seconda della richiesta.Questo viene fatto da ActionSelectionAttribute.

Spiegazione completa qui: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

Altri suggerimenti

Non posso dire con certezza perché questo sta accadendo.Ma potresti prendere in considerazione l'idea di avere solo l'azione Elimina (stringa nome utente) e di rimuovere il sovraccarico senza parametri.

Poiché la stringa è nullable, da quanto ho capito, la semplice chiamata Account/Delete invocherà l'azione con un parametro nomeutente nullo che sarà quindi possibile testare all'inizio del metodo di azione.

Quello che farei è abbandonare lo spazio vuoto Elimina() e utilizzare solo Elimina(string nomeutente)

Nel tuo routing dell'URL avresti qualcosa di simile a "/{Controller}/{Action}/{username}/" ?Se hai "/{Controller}/{Action}/{Id}/" faresti meglio a fare Elimina(string id) e in questo modo usare semplicemente l'URL per gestire questo "/Account/Delete/davide/"

Detto questo usa il tuo percorso predefinito che dovrebbe essere qualcosa come l'ID predefinito è ""

Quindi nel tuo metodo Elimina (string id) hai:

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.
}

Quello o semplicemente racchiuderlo in un metodo su if {} else {}

In ogni caso, seguirei semplicemente l'unico metodo e eseguirei un valore predefinito sul tuo nome utente/id nel percorso di una stringa vuota e lo gestirò in questo modo.

Se vuoi contattarmi per approfondire ulteriormente ciò che intendo, o qualunque cosa possa esserti utile, contattami ad andrew@ il mio dominio nella mia pagina delle informazioni.

Modificare:Ah più o meno quello che ha detto Berko comunque, non sono sicuro di come gli attributi nominati aiuterebbero, quindi per favore pubblica un commento qui dettagliandolo per altri ragazzi che riscontrano gli stessi problemi!:)

È ambiguo perché le due azioni del controller sono lo stesso metodo post..Puoi utilizzarlo solo nello scenario di invio di moduli, ad esempio se stai inviando i dati di un modulo che utilizza l'invio HTTP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top