我很尴尬在这里问这个,因为它已经在StackOverflow上已经多次重复了。我读了很多东西,包括:
http://msdn.microsoft.com/en-us/library/xxwa0ff0
http://msdn.microsoft.com/en-us/library/c8y19k6h.aspx
我认为我已经完成了那些文章所说的内容,但它并不适用于我。
这是我的母版页的顶部,名为“MasterNoNews.master”:
<%@ Master Language="C#" %>
<%@ Import Namespace="MyMediHealth.DataAccess" %>
<%@ Import Namespace="MyMediHealth.DataAccess.Containers" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public virtual UserContainer CurrentUser;
protected void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
CurrentUser = new MembershipQueries().getUserFromUserIdName(Page.User.Identity.Name);
}
</script>
这是我的子页面的顶部,名为“MyProfile.aspx”:
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterNoNews.master"
AutoEventWireup="true" CodeBehind="MyProfile.aspx.cs"
Inherits="MyMediHealth.Interface.MyProfile" %>
<%@ MasterType VirtualPath="~/MasterNoNews.master" %>
这是我的子页面上的代码隐藏,名为“MyProfile.aspx.cs”,它不起作用:
using System;
using System.Web.UI;
using MyMediHealth.DataAccess.Containers;
using MyMediHealth.DataAccess;
namespace MyMediHealth.Interface
{
public partial class MyProfile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// doesn't work
UserContainer user = Master.CurrentUser;
// also doesn't work
UserContainer user = ((MasterNoNews)this.Master).CurrentUser
}
}
}
在第一种情况下,VS告诉我System.Web.Ui.MasterPage不包含CurrentUser的定义。在第二种情况下,VS说无法找到类型或命名空间“MasterNoNews”。
我做错了什么?
答案 0 :(得分:1)
你可能仍然需要将母版页的代码移到后面的代码中,但如果你把它放在那里,
&lt;%@ MasterType VirtualPath =“〜/ MasterPages / Site.master”%&gt;
在aspx页面上,您将能够直接访问母版页的公共方法而无需进行所有投射。像这样:UserContainer user = Page.Master.CurrentUser
如果您从子页面加载中使用母版页的代码,那么我将创建一个界面并让母版页实现它。
答案 1 :(得分:0)
这不起作用,因为您在母版页中创建了属性(而不是代码隐藏)。通常,主页面代码将动态编译,并且将在临时程序集中创建类名(取决于文件名)。由于您没有在临时程序集中考虑此生成的类名,因此会出现错误。正确的方法是为主人提供代码隐藏文件。例如,master将是
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="MasterNoNews.master.cs" Inherits="[Your Namespace].MasterNoNews" %>
在代码隐藏文件(MasterNoNews.master.cs)中有你的属性:
namespace [Your Namespace]
{
public partial class MasterNoNews : System.Web.UI.MasterPage
{
public virtual UserContainer CurrentUser;
protected void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
CurrentUser = new MembershipQueries().getUserFromUserIdName(Page.User.Identity.Name);
}
}
}
现在第二种语法可以正常工作,即
UserContainer user = (([Your Namespace].MasterNoNews)this.Master).CurrentUser