ASP.Net从网页调用Site.Master方法无效

ASP.Net从网页调用Site.Master方法无效,asp.net,visual-studio-2012,master-pages,Asp.net,Visual Studio 2012,Master Pages,我在几个网页上看到了如何从使用主文件的网页调用代码中连接到主文件中定义的公共方法 我正在Visual Studio 2012上使用ASP.Net 4.0 本程序摘自第条: 确保页面可以访问该函数,即声明 公共,并在ContentPage中使用MasterType声明: <%@ Page .... %> <%@ MasterType VirtualPath="~/masterpage.master" %> 当我进入注销页面的代码隐藏并在方法中键入page.Master时

我在几个网页上看到了如何从使用主文件的网页调用代码中连接到主文件中定义的公共方法

我正在Visual Studio 2012上使用ASP.Net 4.0

本程序摘自第条:

确保页面可以访问该函数,即声明 公共,并在ContentPage中使用MasterType声明:

<%@ Page .... %> 
<%@ MasterType VirtualPath="~/masterpage.master" %>

当我进入注销页面的代码隐藏并在方法中键入page.Master时,我看不到我的方法。

您的页面继承自System.Web.UI.page,而System.Web.UI.page只知道其母版页的类型为System.Web.UI.MasterPage。如果要修改母版页的子类,则需要将Page.Master属性强制转换为子类

public class MyPage : System.Web.UI.Page
{
    public new MyMaster Master { get { return base.Master as MyMaster; } }
    public void Page_Load(object sender, EventArgs e)
    {
        Master.MyMasterPageFunction();
    }
}
public class MyMaster : System.Web.UI.MasterPage
{
    public void MyMasterPageFunction()
    {
    }
}

前面的回答确实教育了我,但我相信解决方案是重新启动VS2012,也许清理解决方案和重建并没有造成伤害。不管怎样

Microsoft会自动将以下代码添加到.aspx.designer.cs文件中

    /// <summary>
    /// Master property.
    /// </summary>
    /// <remarks>
    /// Auto-generated property.
    /// </remarks>
    public new MyNamespace.Site Master {
        get {
            return ((BvCorpMain.Site)(base.Master));
        }
正如您所看到的,Microsoft确实通过Master授予了对MyNamespace.Site的访问权,这正是我所需要的

当我遇到问题时,我没有想到检查.aspx.designer.cs文件中的定义。可能是缺少定义,后来又添加了定义,当我重建或进行保存时(我以前做过),或者其他什么


知道添加确实可以简化事情,因为如果不存在,我可以使用该构造手动添加它。

它是否简单,因为您的虚拟路径缺少tildé~字符,所以它应该是VirtualPath=~/SiteMasters/Site.MasterNo,我试过了。微软自动插入的~,我遇到的问题是,它的意思是相对的,但并不总是正确的。我遇到了一些问题,其解决方案是删除~并仅引用域的根。看起来Microsoft有一个bug。它一定是在重新构建解决方案的同时关闭VS2012并重新启动解决了问题。你确实教育了我。非常感谢。但是,您编写的代码不会生成。请看下面我的答案。一定是VS2012的问题。以前,您必须手动强制转换这些对象。
public class MyPage : System.Web.UI.Page
{
    public new MyMaster Master { get { return base.Master as MyMaster; } }
    public void Page_Load(object sender, EventArgs e)
    {
        Master.MyMasterPageFunction();
    }
}
public class MyMaster : System.Web.UI.MasterPage
{
    public void MyMasterPageFunction()
    {
    }
}
    /// <summary>
    /// Master property.
    /// </summary>
    /// <remarks>
    /// Auto-generated property.
    /// </remarks>
    public new MyNamespace.Site Master {
        get {
            return ((BvCorpMain.Site)(base.Master));
        }
namespace MyNamespace
{
    public partial class Site : System.Web.UI.MasterPage