【问题标题】:Accessing ASP.NET Master Pager public properties in child page访问子页面中的 ASP.NET Master Pager 公共属性
【发布时间】:2010-09-28 17:14:45
【问题描述】:

我不好意思在这里问这个问题,因为它显然已经在 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”。

我做错了什么?

【问题讨论】:

    标签: asp.net master-pages


    【解决方案1】:

    您可能仍需要将母版页的代码移动到后面的代码中,但如果您放置此代码,

    在 aspx 页面上,您将能够直接访问母版页的公共方法,而无需进行所有转换。像这样:

    UserContainer 用户 = Page.Master.CurrentUser

    如果您使用来自大量子页面的母版页代码,那么我将创建一个界面并让母版页实现它。

    【讨论】:

      【解决方案2】:

      这不起作用,因为您在母版页中创建了属性(而不是代码隐藏)。通常,母版页代码将被动态编译,并且类名(取决于文件名)将在临时程序集中创建。由于您没有在临时程序集中引用此生成的类名,因此您会收到错误消息。正确的方法是为主人提供代码隐藏文件。例如,主人将是

      <%@ 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        相关资源
        最近更新 更多