2012-04-10 9 views
3

Ich habe eine Blog-Post-Seite mit Kommentaren. Jeder Benutzer (eingeloggt oder nicht) kann ein Formular unten auf der Seite sehen, um einen Kommentar zu schreiben. Wenn der Benutzer den Kommentar eingibt und sie nicht autorisiert ist, wird der Benutzer auf eine Anmelde-/Anmeldeseite umgeleitet. Nach der Anmeldung wird der Benutzer zurück zur Aktion umgeleitet, aber die POST-Daten mit dem Kommentartext sind verloren.ASP.NET MVC - erhalten POST-Daten nach Autorisieren Attribut Login Redirect

Ich benutze die ASP.NET MVC autorisieren Attribut für einige Aktionen Genehmigung erfordern:

[AcceptVerbs(HttpVerbs.Post), Authorize] 
public ActionResult Create(int blogPostID, string commentBody) { 
    var comment = new Comment { 
     Body = commentBody, 
     BlogPostID = blogPostID, 
     UserName = User.Identity.Name 
    } 
    // persist the comment and redirect to a blog post page with recently added comment 
} 

Wie lösen Sie dieses Problem?

Die Benutzeranmeldung vor der Anzeige des Kommentarformulars ist eine schlechte Idee, denke ich.

Danke.

Antwort

3

Ich würde wahrscheinlich nur speichern Sie die SiteId und Kommentar in die Sitzung. Erstellen Sie dann eine weitere Überladung für Create, die keine Parameter verwendet. Es überprüft, ob diese Variablen in der Sitzung vorhanden sind. Wenn dies der Fall ist, übergeben Sie sie an Ihre ursprüngliche Create-Methode.

Um dies zu tun, müssten Sie das Autorize-Attribut entfernen und nur die Sicherheitsprüfung selbst durchführen. Etwas wie folgt aus:

var user = HttpContext.User; 

if (!user.Identity.IsAuthenticated) 
{ 
    Session["Comment"] = comment; 
    Session["SiteId"] = siteId; 
    return RedirectToAction("LogOn", "Account", 
          new { returnUrl = "/ControllerName/Create"}); 
} 

Dann erstellen Sie Ihre überlastet:

public ActionResult Create() 
{ 
    var comment = (Session["Comment"] ?? "").ToString(); 
    int siteId = 0; 
    if (Session["siteId"] != null) 
     siteId = (int)Session["siteId"]; 

    return Create(siteId, comment); 
} 

Natürlich ist dies alles nicht wirklich, dass generische und nicht komplexere Szenarien umgehen kann, aber es ist eine Idee. (Hoffentlich funktioniert der obige Code, ich hatte keine Chance, es zu testen). Es sieht so aus, als könnten Sie vielleicht so etwas über einen Aktionsfilter tun, aber ich habe keinen Beispielcode dafür.

+0

Danke, sieht brauchbar aus. Ich habe die Aktionsparameter von "siteId, Kommentar" zu "int blogPostID, string commentBody" in meiner ersten Frage geändert, aber die Idee ist klar. – Zelid

+0

Ich entschied mich für diese Lösung. Es funktioniert gut wie jetzt. In einer Webfarm können Probleme auftreten, wenn die Sitzung nicht über alle Server hinweg gefüllt ist. In diesem Fall würde ich einen Kommentar in einer Datenbank ohne die UserId speichern und die CommentId dem Cookie des Besuchers hinzufügen, und nach der Autorisierung den Kommentar-Datensatz mit der autorisierten UserId aktualisieren. – Zelid

1

Sie können das ausgeblendete Feld in Ihrem Autorisierungsformular verwenden. Geben Sie den Kommentar Ihres Benutzers in dieses Feld ein (Ihre anfänglichen POST-Daten). Danach können Sie die Daten in Ihrem Kommentarformular immer noch nicht verwenden, wenn das Autorisierungsformular einfach zu Ihrem Kommentarformular umleitet. Machen Sie also Ihr Autorisierungsformular zum Kommentarformular, die Daten im versteckten Feld werden ebenfalls veröffentlicht, damit Sie es verwenden können.

+1

Die Autorisierung enthält OAuth/OpenID-Optionen, die eine Weiterleitung zu Facebook/Twitter bewirken. Die externe OAuth-Autorisierungsseite unterstützt den "versteckten Eingabevertrag" nicht und die Daten sind weiterhin verloren. – Zelid

+0

Wusste das nicht. – Dima