在MVC中动态加载用户控件

时间:2011-09-16 20:32:43

标签: asp.net-mvc vb.net

我有一个UserControl.ascx,它基本上输出了我网站上每个页面顶部当前登录用户的名称和电子邮件(存储在会话变量中,用于记录)。 Site.Master目前使用<%Html.RenderPartial("UserControl")%>调用所述控件。

我第一次登录时工作正常,我的详细信息显示正确,但是当我退出并尝试再次登录时发生了一些奇怪的事情......

Control本身测试条件Session("auth"),我的控制器在验证用户时设置为true,并在按下注销按钮时强制为false。注销后会清除所有会话变量。

(对于记录,我的用户控件用于检查Request.IsAuthenticated而非Session("auth")以确定当前的会话状态。出现了同样的问题。)

问题在于,当我尝试以其他用户身份登录时,不会在标题中显示新用户的信息,而是名称:和电子邮件旁边没有任何内容:(请参阅下面的代码)。我怀疑这是因为UserControl.ascx没有更新其状态。

理想情况下,我想要一个解决方案,它会强制UserControl在每次加载页面时检查Session变量。有没有一种干净的方法来实现这一目标?

<%@ 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

1 个答案:

答案 0 :(得分:0)

Session("auth")属于object类型。您需要检查null并强制转换为在if语句中键入bool。否则,您只是检查会话中是否有对象,无论是真还是假。这解释了为什么它第一次工作而不是第二次工作。

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