Frage

Ich habe ein Problem mit einem Beispielrouting mit der Vorschau 5 von asp.net mvc.

Im AccountController habe ich 2 Aktionen:

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

Beim Versuch, nach „Account/Delete“ oder „Account/Delete?username=davide“ zu suchen, löst der ControllerActionInvoker eine Ausnahme aus, die besagt, dass die Löschanforderung zwischen meinen beiden Aktionsmethoden nicht eindeutig ist.

Die Standardroute in global.asax wurde nicht geändert.

Sollte der Aktionsaufrufer nicht verstehen, welche Methode aufzurufen ist, indem er in der Parameterliste nachschaut?

Mit der Vorschau 4 hatte ich bei der Ausführung desselben Vorgangs keine derartigen Probleme.

Irgendeine Idee?

War es hilfreich?

Lösung

Lösung gefunden!

Mit der Einführung des ActionNameAttribute ist es nun notwendig, je nach Anforderung manuell zu filtern, welche Methode aufgerufen werden soll.Dies erfolgt durch das ActionSelectionAttribute.

Vollständige Erklärung hier: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

Andere Tipps

Ich kann nicht sicher sagen, warum das passiert.Möglicherweise möchten Sie jedoch nur die Aktion „Delete(string username)“ verwenden und die Parameter-lose Überladung entfernen.

Da die Zeichenfolge nullwertig ist, wird meines Wissens nach durch einfaches Aufrufen von „Konto/Löschen“ die Aktion mit einem Null-Benutzernamenparameter aufgerufen, den Sie dann am Anfang der Aktionsmethode testen können.

Was ich tun würde, wäre, das leere Feld „Delete()“ wegzulassen und nur „Delete(string username)“ zu verwenden.

In Ihrem URL-Routing hätten Sie etwas Ähnliches wie „/{Controller}/{Action}/{username}/“ ?Wenn Sie „/{Controller}/{Action}/{Id}/“ haben, ist es besser, „Delete(string id)“ auszuführen und auf diese Weise einfach die URL zu verwenden, um dieses „/Account/Delete/davide/“ zu verarbeiten.

Verwenden Sie jedoch Ihre Standardroute, die etwa so aussehen sollte, dass die Standard-ID „“ ist.

Dann haben Sie in Ihrer Methode „Delete(string id)“ Folgendes:

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

Das oder packen Sie es einfach in die One-Methode für ein if {} else {} ein.

So oder so würde ich mich einfach für die eine Methode entscheiden und einen Standardwert für Ihren Benutzernamen/Ihre ID in Ihrer Route mit einer leeren Zeichenfolge festlegen und es auf diese Weise handhaben.

Wenn Sie mit mir Kontakt aufnehmen möchten, um weiterzuverfolgen, was ich meine, oder was auch immer Ihnen weiterhilft, pingen Sie mich auf meiner Infoseite unter andrew@ meiner Domain an.

Bearbeiten:Ah, so ziemlich das, was Berko gesagt hat. Ich bin mir nicht sicher, wie benannte Attribute helfen würden. Bitte hinterlassen Sie hier einen detaillierten Kommentar für andere Leute, die die gleichen Probleme haben!:) :)

Es ist nicht eindeutig, da die beiden Controller-Aktionen dieselbe Post-Methode sind.Sie können dies nur in einem Formular-Posting-Szenario verwenden, wenn Sie beispielsweise Formulardaten senden, die HTTP-Post verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top