2013-04-15 26 views
12

Ich bin gerade dabei, ein College-Projekt abzuschließen, ich bin mir nicht sicher, ob ich zu lange auf meinen Computer gestarrt habe und etwas offensichtlich vermisse, aber wenn ich es versuche um einen Benutzer auszuloggen, bekomme ich eine 404 nicht gefunden für die URL/Account/LogOff.MVC 4 - LogOff-Controller-Aktion gibt 404 nicht gefunden

ich eine navbar haben, das zeigt, Login/Logout je nachdem, ob ein Benutzer, angemeldet, oder abgemeldet:

<div class="nav-collapse collapse"> 
    <ul class="nav pull-right"> 
     <li class="dropdown" id="dropdown-login-div"> 
      @if (!Request.IsAuthenticated) 
      { 
       <a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a> 
      } 
      else 
      { 
       @Html.ActionLink("Log Off", "LogOff", "Account") 
      } 
      <div class="dropdown-menu" id="dropdown-login"> 
       @Html.Partial("~/Views/Account/_LoginPartial.cshtml", new ViewDataDictionary<LetLord.Models.LoginModel>()) 
      </div> 
     </li> 
    </ul> 
</div> 

in meinem Konto-Controller die Standard LogOff Aktion, die mit dem Internet kommt vorlage:

Könnte mir jemand sagen, warum das passiert - bevor ich meinen Laptop gegen die Wand schmeiße. Prost.

Antwort

39

Sie verwenden einen Link (<a/>-Tag), um sich abzumelden, die in führt HTTP GET Anfrage, wenn der Benutzer darauf klickt, aber die Aktion ist beschränkt POST Anfrage nur zu dienen (weil es mit [HttpPost]-Attribut versehen ist) .

Sie müssen entweder Ihren Link in ein Formular einfügen und eine POST-Anfrage generieren, oder entfernen [HttpPost] und [ValidateAntiForgeryToken] (Credits zu GalacticCowboy) von Ihrer Aktion.

+0

Das ist richtig - und meine Empfehlung wäre es, die Httppost zu entfernen, anstatt eine Form zu schaffen, um die Abmeldung. Da Sie keine Daten an den Server senden, ist ein GET am besten für eine Abmeldeaktion geeignet. –

+0

'ValidateAntiForgeryToken' wird fehlschlagen, da es auch kein Formularpost ist. – GalacticCowboy

+0

Völlig ging mir über den Kopf. Vielen Dank. – MattSull

28

Da Abmelde Server Zustand ändert, ich würde nicht entfernen [Httppost] und [ValidateAntiForgeryToken] Stattdessen werde ich den Link (Anker-Tag) mit dem folgenden

@using (Html.BeginForm("Log Out", "Account", FormMethod.Post, 
new { id = "logoutForm" })) 
{ 

    @Html.AntiForgeryToken() 
    <a href="javascript:document.getElementById('logoutForm').submit()">Log Out</a> 

} 
+0

sehr gute Lösung, Mann, einfach zu implementieren und erklärt das Problem. – Gent

0

ich auf einem Legacy-App lief in dieser Frage ersetzen . Die Art und Weise, wie ich es behoben habe, war zu erkennen, wann die gelieferte Rückkehr-URL "/ Account/LogOff" war und dementsprechend zu handeln. Aus der Datei ‚AccountController.cs‘ ‚Login‘, Methode:

if (returnUrl == "/Account/LogOff") 
    { 
     return this.RedirectToLocal(null); 
    } 
    else 
    { 
     return this.RedirectToLocal(returnUrl); 
    }  
Verwandte Themen