我在ASP.NET中做错了什么

时间:2010-08-06 10:23:25

标签: asp.net master-pages scope

这是我的母版页代码:

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");
            }
        }
    }
}

我正在尝试使用作为母版页的所有页面访问isloggedIn!我得到的错误如下:

  

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

     

错误3'System.Web.UI.MasterPage'不包含'isLoggedIn'的定义,并且没有扩展方法'isLoggedIn'接受类型'System.Web.UI.MasterPage'的第一个参数可以找到(是你错过了使用指令或程序集引用?)

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:2)

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

,您的this.Master类型变为AlphaPack.MasterPages.Main而不是System.Web.UI.MasterPage。所以你可以在没有演员的情况下访问它:

 this.Master.IsLoggednIn

目前您需要做下一步:

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

更好 - 创建一个属性。并且在ViewState中保存数据不是变量(阅读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 App项目,而不是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" %>

答案 1 :(得分:1)

if (((MasterPage)Page.Master).isLoggedIn)

应该是

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

您将Master转换为MasterPage类型(因为它已经是MasterPage而无用)。但MasterPage不包含属性isLoggedIn。这就是你无法访问它的原因。

因此,只需将Master属性转换为正确的类型,在您的情况下mysite.MasterPages.Main

答案 2 :(得分:0)

通常会将此类全局“状态”存储在会话变量中。是作为查询字符串参数传递它吗?

你为什么不把代码放在代码中呢?

修改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");
        }
    }

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

编辑2:

你在评论中说:

  

我将如何访问   其他页面上的变量?

我有三种方法可以想到:

  • 查询字符串(每页请求)
  • ViewState(每页)
  • 会话变量(全球可用)

答案 3 :(得分:0)

这里的问题是你在内联代码块中声明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)
    {
    }
%>

但是,我不确定这是达到你想要的最佳方式。我可能会将这个逻辑从主页面中删除,并将其粘贴在专门构建的身份验证类或服务中。