代码之家  ›  专栏  ›  技术社区  ›  Tom Gullen

我在ASP.NET中做错了什么

  •  2
  • Tom Gullen  · 技术社区  · 14 年前

    下面是我的母版页代码:

    namespace mysite.MasterPages
    {
        public partial class Main : System.Web.UI.MasterPage
        {
            public bool isLoggedIn;
    
            protected void Page_Load(object sender, EventArgs e)
            {
                isLoggedIn = Request.IsAuthenticated;      // Is the user currently logged in
            }
        }
    }
    

    下面是我的注册页面代码:

    namespace mysite
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (((MasterPage)Page.Master).isLoggedIn)
                {
                    Response.Redirect("default.aspx");
                }
            }
        }
    }
    

    错误2当前上下文中不存在名称“isLoggedIn”

    错误3“System.Web.UI.MasterPage”不包含“isLoggedIn”的定义,并且找不到接受“System.Web.UI.MasterPage”类型的第一个参数的扩展方法“isLoggedIn”(是否缺少using指令或程序集引用?)

    谢谢你的帮助。

    4 回复  |  直到 4 年前
        1
  •  2
  •   abatishchev Marc Gravell    14 年前

    添加 <%@ MasterType VirtualPath="~/Main.master" %> 添加到页面标记。

    还有你的 this.Master AlphaPack.MasterPages.Main 而不是 System.Web.UI.MasterPage . 因此,您无需强制转换即可访问它:

     this.Master.IsLoggednIn
    

    目前你需要做下一步:

    ((AlphaPack.MasterPages.Main)this.Master).isLoggednIn
    

    更好的办法是创建一个属性。并且不在变量中保存数据,而是在ViewState(read)中保存数据 Control State vs. View State ):

    namespace AlphaPack.MasterPages
    {
        public partial class Main : System.Web.UI.MasterPage
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                this.IsLoggedIn = Request.IsAuthenticated;
            }
    
            public bool IsLoggedIn
            {
                get { return this.ViewState["isLoggedIn"] as bool? ?? false; }
                set { this.ViewState["isLoggedIn"] = value; }
            }
        }
    }
    

    那么代码隐藏呢。我建议使用Web应用程序项目,而不是网站项目(这是过时的)!

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyPage.aspx.cs" Inherits="MyNamespace.MyPage" MasterPageFile="~/MyMaster.master" Title="MyTitile" %>
    

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyPage.aspx.cs" Inherits="MyPage" MasterPageFile="~/MyMaster.master" Title="MyTitile" %>
    
        2
  •  1
  •   Julien N    14 年前
    if (((MasterPage)Page.Master).isLoggedIn)
    

    应该是

    if (((mysite.MasterPages.Main)Page.Master).isLoggedIn)
    

    你投的 Master MasterPage 类型(因为它已经是 母板页 ). 但是 不包含属性 isLoggedIn

    硕士 属性的正确类型,在您的情况下 mysite.MasterPages.Main

        3
  •  0
  •   Matt B    14 年前

    isLoggedIn

    您需要将它作为变量添加到代码隐藏类或 <script runat="server"></script> 标记,如果在内联中添加服务器端代码,即(为简洁起见,请删减):

    <script runat="server">
    
        public bool IsLoggedIn;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            IsLoggedIn = Request.IsAuthenticated;
        }
    
    </script>
    

    然后可以访问子页中的母版页,如下所示:

    <%
        if (((MasterPage)Page.Master).IsLoggedIn)
        {
        }
    %>
    

    然而,我不确定这是实现你想要的最好的方法。我可能会将该逻辑从母版页中去掉,并将其粘贴到专门构建的身份验证类或服务中。

        4
  •  0
  •   Darknight    14 年前

    你为什么不把代码放在后面?

    编辑1:

      Response.Redirect("default.aspx");
    

     protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.IsAuthenticated)      // Is the user currently logged in
            {
                Response.Redirect("default.aspx");
            }
        }
    

    如果这是您希望使用此母版页的所有页面的默认行为。

    其他页面上的变量?

    我可以想到三种方法:

    • 查询字符串(每页请求)
    • 视图状态(每页)