看了msdn的介绍和例子:The followin code example shows how to use a content page to access the public property
SiteName on the master page in the preceding code example.
在content page可以调用master page的公共属性
问题是:我想把公共属性放在cs的类文件而不是aspx文件,在content page就无法调用了。
代码如下:
public partial class myMaster : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
public string demo
{
get
{
return "test";
}
}
}
在content page中:
myMaster = (myMaster)this.Master;
myMaster. --这时候看不到demo这个属性的,强制调用也不可以
SiteName on the master page in the preceding code example.
在content page可以调用master page的公共属性
问题是:我想把公共属性放在cs的类文件而不是aspx文件,在content page就无法调用了。
代码如下:
public partial class myMaster : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
public string demo
{
get
{
return "test";
}
}
}
在content page中:
myMaster = (myMaster)this.Master;
myMaster. --这时候看不到demo这个属性的,强制调用也不可以
http://chagel.mvpcn.net/PermaLink.aspx?guid=bdebcc52-6718-4012-a1e8-6d99b429fb56
<%@ MasterType VirtualPath="~/MasterPage.master" %> 关键注意这里
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</asp:Content>
protected void Button1_Click(object sender, EventArgs e)
{
Master.LabelOfMasterPage = "aa";
}masterpage.master
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form> public string LabelOfMasterPage
{
get { return this.Label1.Text; }
set { this.Label1.Text = value; }
}
你说的,我已经尝试过了
在contentpage的cs中还是无法调用的;
这样在content page中就无法调用了。
你说的,我已经尝试过了
把属性放在aspx文件中,使用如下形式,类似msdn的例子
<script runat =server >
public string LabelOfMasterPage
{
get { return this.Label1.Text; }
set { this.Label1.Text = value; }
}
</Scrip>
这样在aspx中是可以使用<script ></Scrip>的形式来调用。
但是
1、无法在content page的cs文件(partial class中)调用
2、如果在master page中也将属性放在cs文件(partial class中),
那么在contentpage的cs和aspx中都是无法调用的;
你的同意是解决不了问题的 :)
其实可能最终的疑惑是这样的:
在代码隐藏文件中可以直接调用Aspx界面文件中定义的控件;
反之则不可以,即在partial cs文件中定义的公共属性,在aspx中是无法被调用的感觉自己对partial 类的理解的问题
还请思归来释疑
思归,你在哪里 :)
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>master page
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>2. MasterPage.master.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{ } public string demo
{
get
{
return "test";
}
} }3. Content.aspx<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Content.aspx.cs" Inherits="Content" Title="Untitled Page" %>
<%@ MasterType VirtualPath="~/MasterPage.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
Content Page:<br />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</asp:Content>4. Content.aspx.csusing System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class Content : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
/* MasterPage m = (MasterPage)this.Master;
Response.Write(m.demo);
*/
MasterPage m = this.Master;
Response.Write(m.demo);
}
}>>>对partial 类的理解的问题最终的类是从cs中的partial类以及动态产生的一个含有控件声明的类合并后的类继承来的http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/Internals.asp
1、myMasterPage.Master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="myMasterPage.master.cs"
Inherits="myMasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public string demoAspx
{
get { return "demoAspx"; }
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>2、myMasterPage.master.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class myMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{ }
public string demoPartial
{
get { return "demoPartial"; }
}
}3、Content.Aspx
<%@ Page Language="C#" MasterPageFile="~/myMasterPage.master" AutoEventWireup="true"
CodeFile="content.aspx.cs" Inherits="content" Title="Untitled Page" %>
<%@ MasterType VirtualPath="~/myMasterPage.master" %>
<script runat="server">
protected void demo()
{
myMasterPage myMaster = this.Master;
Response.Write(myMaster.demoPartial);
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
</asp:Content>4、Content.Aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class content : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
myMasterPage myMaster = this.Master;
Response.Write(myMaster.demoPartial);
}
}
我在MasterPage的aspx及cs中定义了两个属性:demoAspx及demoPartial
然后分别在contentPage的aspx及partial class(以下简称cs)中调用
昨天出现的问题是无法在contentPage的aspx及cs中调用masterPage cs定义的属性
今天上班后重新打开vs.net2005调试,昨天的问题就不存在了。
而出现的的新问题是:无法调用masterPage aspx定义的属性
呵呵,大家可以把我的代码copy去调试
现在我给出的解释,就是可能因为我安装的是D版么? :)
我安装的是vs.net2005 英文版2.0.50727 (D版)
OS是win2000英文版sp4 (正版)
不过机器同时还安装有vs.net2003英文版1.1.4322 sp1 (正版)
如果
1、myMasterPage.Master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="myMasterPage.master.cs"
Inherits="myMasterPage" %>
修改为:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="~/myMasterPage.master.cs"
Inherits="myMasterPage" ClassName="myMasterPage" %> --即加入className
那么:
在content的aspx中可以调用demoAspx属性的
<%@ MasterType VirtualPath="~/myMasterPage.master" %>你总是可以访问你的MasterPage的属性/方法的,使用this.Master.demo或者this.Master.demoAspx,只要它们是公开的
最重要的指点:“你总是可以访问你的MasterPage的属性/方法的,使用this.Master.demo或者this.Master.demoAspx,只要它们是公开的”
我一直想用如下的方式调用:
myMasterPage myMaster = this.Master;
myMaster.属性
我的实践证明:用myMaster即使设置了MasterType,那么也无法在content cs中调用masterpage aspx公开的属性的 :)
总结:
一、在content page的aspx中设置mastertype,在content page的aspx或cs中直接调用this.Master.属性(方法);
二、如果使用myMasterPage myMaster = this.Master;使用myMaster来调用,那么:
1、master page 的aspx中加入className,那么在master page aspx中定义的属性在content page的aspx中可见;
2、content page 的aspx中调用master page的aspx或cs定义的方法都可见;
3、content page 的cs 中调用master page的cs定义的方式可见,无法调用master page的aspx定义的方法;