2016-12-01 60 views
1

我想創建一個局部視圖登錄,而無需刷新整個瀏覽器,當有人在登錄。登錄在局部視圖不工作

登錄控制器完美的作品,也它選擇確定的部分查看它必須稍後顯示。問題是這部分視圖沒有檢測到用戶已經登錄。

如果我刷新網絡(F5),我可以看到用戶正如我所說的那樣記錄良好。

的Controler:

[AllowAnonymous] 
public ActionResult Login() { 
    return PartialView("_Login"); 
} 

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Login(LoginModel model, string returnUrl) { 
    if(ModelState.IsValid) {    
     if(WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe.Value)) { 
      return PartialView("LogOnPartialView", "Shared");      
     } 
     ModelState.AddModelError("", "The user name or password provided is incorrect."); 
    } 
    return View(model); 
} 

管窺_login

@using (Ajax.BeginForm("Login", "Account", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "loginControl" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-field"> 
     @Html.EditorFor(m => m.UserName) 
     @Html.ValidationMessageFor(m => m.UserName) 
    </div> 

    <div class="form-field"> 
     @Html.EditorFor(m => m.Password) 
     @Html.ValidationMessageFor(m => m.Password) 
    </div> 

     <input type="submit" value="Login" /> 
} 

管窺LogOnPartialView

@if (HttpContext.Current.User.Identity.IsAuthenticated) 
{ 
    <div>user is logged</div> 
} 
else 
{ 
    <div>user is NOT logged</div> 
} 

@if(!Request.IsAuthenticated) 
{ 
    @Html.ActionLink("Registro", "Register", "Account") 
    @: | 
    @Ajax.ActionLink("Login", "Login", "Account", new AjaxOptions { UpdateTargetId = "Login" }) 
} 
else 
{ 
    @: Welcome <b>@User.Identity.Name</b>! 

    @: | 
    @Html.ActionLink("Logout", "LogOff", "Account") 
} 

誰能幫助我,好嗎?

+0

嘗試'User.Identity.IsAuthenticated',而不是'HttpContext.Current.User.Identity.IsAuthenticated'? –

+0

兩者都是一樣的。以防萬一我已經嘗試過,它仍然無法工作。 Ty無論如何。 –

+0

很少有開發人員使用自定義'IdentityPrinciple',所以只是檢查你的應用程序中是否有這種情況......是否是表單身份驗證模式? –

回答

2

我懷疑你會以目前的形式得到這個工作。如果你讀它the docs指出

當用戶登錄時,ASP.NET將認證令牌在cookie中,讓ASP.NET知道後續請求用戶已經被記錄

注意使用術語「後續請求」。 在同一個請求中使用它的問題是傳入的請求有而不是發送了auth cookie,因此IsAuthenticated爲false。 即

  1. 瀏覽器提交Login
  2. 服務器與Set-Cookie
  3. 瀏覽器響應發送這個cookie(在auth餅乾)在下一個要求

這是它的工作原理,當你的理由打F5

你可以做什麼來解決這個問題是重新考慮調用WebSecurity.Login的SULT指示用戶是否登錄成功和到您的LogOnPartialView

+0

這是一個解決方案。實際上,我可以將調用的結果傳遞給'WebSecurity.Login'並在視圖中獲取true/false值。但PartialView仍然不知道用戶名,有時它不能正確刷新,所以我認爲最好的解決方案是使頁面以總頁面刷新的常用方式進行。無論如何ty你的答案,我會標記爲有效。享受代表:) –

+0

在21小時內,我會給你的賞金。我不能早點。 –

+0

@AlvaroMenéndez你也可以將用戶名傳遞給視圖模型...但是我看不到頁面重新加載的問題...如果你真的想讓它在沒有頁面的情況下重新加載視圖,看起來不太複雜...你可以簡單地讓你的'Login'方法使用javascript更新頁面的相關部分(假設它成功了) – wal