访问子页面中的ASP.NET Master Pager公共属性

时间:2010-09-28 05:53:57

标签: asp.net master-pages

我很尴尬在这里问这个,因为它已经在StackOverflow上已经多次重复了。我读了很多东西,包括:

http://msdn.microsoft.com/en-us/library/xxwa0ff0

http://msdn.microsoft.com/en-us/library/c8y19k6h.aspx

http://www.velocityreviews.com/forums/t110056-cannot-access-strongly-typed-properties-in-master-page.html

我认为我已经完成了那些文章所说的内容,但它并不适用于我。

这是我的母版页的顶部,名为“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”。

我做错了什么?

2 个答案:

答案 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