2011-09-16 1 views
2

私はUserControl.ascxを持っています。私のウェブサイトのすべてのページの上部に、現在ログインしているユーザの名前とEメールを(セッション変数に記録して)出力します。前記コントロールは現在Site.Masterによって呼び出され、<%Html.RenderPartial("UserControl")%>を使用している。MVCでユーザコントロールを動的にロード

私が初めてログインすると、私の詳細が正しく表示されますが、私はログアウト時と奇妙な問題が発生し、再び何かをログインしようとすると、それは正常に動作します...

コントロール自体は、条件をテストSession("auth")私のコントローラは、ユーザ認証時にtrueに設定され、ログアウトボタンが押されたときには強制的にfalseになります。ログアウトすると、すべてのセッション変数がクリアされます。

は(記録のために、私のユーザーコントロールは、現在のセッション状態を決定するために Request.IsAuthenticatedではなく Session("auth")をチェックするために使用。同じ問題がarised。)

の問題は、私は別のユーザーとしてログインしようとすると、新しいユーザーの情報をヘッダーに表示するのではなく、名前:および電子メール:の横に何も表示されません(下記のコードを参照)。 UserControl.ascxが状態を更新していないためです。

理想的には、ページが読み込まれるたびにUserControlにセッション変数を強制的にチェックさせるソリューションが必要です。これを達成するためのきれいな方法はありますか?ここで

<%@ Control Language="VB" AutoEventWireup = "false" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%-- The following line works around an ASP.NET compiler warning --%> 
<%: ""%> 
<% 
    If Session("auth") Then 
    %> 
     Name: <b><%: System.Web.HttpContext.Current.Session("user")%></b> 
     [ <%: Html.ActionLink("Log Off", "LogOff", "Account")%> ]<br /> 
     Email: <b><%: System.Web.HttpContext.Current.Session("email") %></b> 
    <% 
    Else 
    %> 
     Name: <b>Not logged in</b> 
     [ <%: Html.ActionLink("Log On", "LogOn", "Account")%> ]<br /> 
     Email: <b>Not logged in</b> 
    <%   
    End If 
%> 

は、ログインページでフォーム送信を扱う私のコントローラからのコードです:

<HttpPost()> _ 
    Public Function LogOn(ByVal model As LogOnModel, ByVal returnUrl As String) As ActionResult 
     If ModelState.IsValid Then 
      If MembershipService.ValidateUser(model.UserName, model.Password) Then 
       FormsService.SignIn(model.UserName) 
       If Not String.IsNullOrEmpty(returnUrl) Then 
        Return Redirect(returnUrl) 
       Else 
        Session("auth") = True 
        Session("user") = model.UserName 
        Session("email") = MembershipService.GetEmail(model.UserName, model.Password) 
        Return RedirectToAction("Index", "Home") 
       End If 
      Else 
       ModelState.AddModelError("", "Invalid username or password.") 
      End If 
     End If 

     ' If we got this far, something failed, redisplay form 
     Return View(model) 
    End Function 
+0

ログイン時にセッション変数をリセットしている場合は、ユーザーコントロールで明示的にキャッシュするのでない限り、現在の状態にする必要があります。使用しているコードをUserコントロールに投稿できますか? –

+0

このコントロールも参照するSite.Masterからセクションを投稿する必要がありますか?途中ですぐにお返事いただきありがとうございます! – Kevin

+0

コントローラ内にログインしたとき(またはセッション変数を設定したとき)に、あなたが何をするかをチェックすることが重要だと思います。 – abx78

答えて

0

Session("auth")はObject型です。 if文でnullをチェックし、boolと入力する必要があります。それ以外の場合は、セッションにオブジェクトが存在するかどうか(trueまたはfalse)を確認するだけです。これはなぜそれが最初のもので、2番目のものではないのかを説明します。

Dim isAuth As Boolean 
Dim auth As String = TryCast(Session("auth"), String) 
If Boolean.TryParse(auth, isAuth) AndAlso isAuth Then 
    ' logged in 
Else 
    ' not logged in 
End If 
+0

私はちょうどこのスニペットを試してみましたが、今はコントロールが動作しています名前:ログインしていない、メール:ログインしていない)。 Web.configが認証されたユーザーに表示を制限しているにもかかわらず、サイトを自由にナビゲートすることができます。つまり、UserControlはまだ認証を認識していないサイトの唯一のユニットです。私はちょっとだけコントローラを投稿します。 – Kevin

+0

ロジックが反転していますか?デバッガをステップ実行し、if文で何が起きているのか、IsAuthenticatedが何に設定されているのかを確認するだけでよいでしょう。 – TheCodeKing

+0

また、あなたのコントローラでは、戻り値のURLがある場合はセッション変数を決して設定しません。 – TheCodeKing

関連する問題