2016-07-08 10 views
0

Ich habe folgende Login Beitrag Aktion in der Steuerung:Wie wird eine erfolgreiche Anmelde-Popup-Meldung angezeigt, wenn die erfolgreiche Anmeldung an eine Weiterleitungs-URL gesendet werden kann?

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    [Auditing] 
    public async Task<ActionResult> Login(LoginModel details, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      AppUser user = await UserManager.FindAsync(details.Name, 
       details.Password); 
      if (user == null) 
      { 
       ModelState.AddModelError("", "Invalid name or password."); 
      } 
      else 
      { 
       ClaimsIdentity ident = await UserManager.CreateIdentityAsync(user, 
        DefaultAuthenticationTypes.ApplicationCookie); 
       ident.AddClaims(LocationClaimsProvider.GetClaims(ident)); 
       ident.AddClaims(ClaimsRoles.CreateRolesFromClaims(ident)); 
       AuthManager.SignOut(); 
       AuthManager.SignIn(new AuthenticationProperties 
       { 
        IsPersistent = false 
       }, ident); 


       //Persist login into DB upon successful login 
       Loginrecord login = new Loginrecord(); 
       login.Username = user.UserName; 
       login.SessionId = HttpContext.Session.SessionID; 
       Session["sessionid"] = HttpContext.Session.SessionID; 
       login.Date = DateTime.Now; 
       SQLLoginrecord sqlLogin = new SQLLoginrecord(); 
       sqlLogin.PutOrPostLogin(login); 
       //End addition 

       return Redirect(returnUrl); 


      } 

     } 
     ViewBag.returnUrl = returnUrl; 
     return View(details); 
    } 

Seit einer erfolgreichen Anmeldung von dieser Aktion von einer Zulassung erfordernden Seite gibt den Benutzer die URL in der Adressleiste des Browsers gehen kann, wie Kann ich eine Popup-Nachricht anzeigen, die auf eine erfolgreiche Anmeldung hinweist? Wenn ich mit dem ViewBag-Ansatz fortfahren und eine Success-Variable hinzufügen möchte, muss ich dann auf diesen ViewBag von jeder View (einschließlich einiger, die kein gemeinsames Layout haben) der Anwendung zugreifen, die eine Authentifizierung erfordert?

Antwort

0

Redirect Methode wird eine 302 Antwort auf den Browser mit der neuen URL in der Location-Header und Browser wird eine völlig neue HTTP-Anfrage für diese URL. ViewBag wird dir also nicht helfen.

Sie könnten die Verwendung von TempData (die für den nächsten Aufruf funktioniert) in Betracht ziehen, um Daten von Ihrer Login-Aktionsmethode für andere Aktionsmethoden zu verwenden. Sie können einen Aktionsfilter schreiben, der das TempData-Element überprüft und den entsprechenden ViewBag-Eintrag einstellt, sodass Sie in Ihren anderen Ansichten beliebig arbeiten können.

public class LoginMsg : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var msg=filterContext.Controller.TempData["LoginMsg"] as string; 
     if (!String.IsNullOrEmpty(msg)) 
     { 
      filterContext.Controller.ViewBag.LoginMsg= msg; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Jetzt in Ihrem Login-Klasse, vor Umleiten, stellen Sie die TempData

public async Task<ActionResult> Login(LoginModel details, string returnUrl) 
{ 
    // do stuff 
    TempData["LoginMsg"]="Logged in successfully"; 
    return Redirect(returnUrl); 
} 

Jetzt Ihre anderen Aktionsmethoden dekorieren (oder Sie es auf Controller-Ebene tun können) mit unserem Action-Filter.

[LoginMsg] 
public ActionResult Dashboard() 
{ 
    return View(); 
} 

aus Ihrer Sicht oder der _Layout, können Sie den ViewBag Element zugreifen und den Code auf den Trigger Ihre Popup-Steuerelement aufrufen.

<script> 
    var msg = "@ViewBag.Msg"; 
    if (msg.length) { 
     // alert(msg); 
     // Call the code to fire the popup now 
     // yourMagicPopupPlugin.Popup(msg); 
    } 
</script> 
+0

Danke. Das hat in meiner Bewerbung funktioniert. Ich musste die LoginMsg Dekoration zu LoginMsgFilter ändern (würde nicht anders kompilieren). Dann fügte ich einen cshtml im Shared-Ordner von Views hinzu: popup_login.cshtml wie folgt: @ { var message = TempData ["LoginMsg"] ?? string.Empty; } var message = '@message'; if (Nachricht) Alert (Nachricht); Und in jeder der Ansichten wollte ich das Popup erscheinen, ich @RenderPage ("~/Views/Shared/popup_login.cshtml") hinzugefügt. Ist das der beste Ansatz? – ITWorker

+1

Sie können es in das Layout einfügen. Siehe die aktualisierte Antwort. – Shyju