这是我的母版页代码:
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'的第一个参数可以找到(是你错过了使用指令或程序集引用?)
任何帮助表示感谢。
答案 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:
你在评论中说:我将如何访问 其他页面上的变量?
我有三种方法可以想到:
答案 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)
{
}
%>
但是,我不确定这是达到你想要的最佳方式。我可能会将这个逻辑从主页面中删除,并将其粘贴在专门构建的身份验证类或服务中。