解析器错误:'_Default'在此处不被允许,因为它没有扩展类'System.Web.UI.Page'和MasterType声明。

45

我最近将一个网站项目转换为Visual Studio 2008中的Web应用程序项目。我终于成功编译了它,并且第一个页面(登录页面)正常显示,但是当它重定向到Default.aspx页面时,我收到了一个错误:

Parser Error Message: 'SOME.NAMESPACE.MyApplicationName.WebApplication._Default' is not allowed here because it does not extend class 'System.Web.UI.Page'.

我的所有页面都继承自一个名为"BasePage"的类,该类扩展了System.Web.UI.Page。显然,问题不在于该类,因为login.aspx页面能够正常显示,并且它也继承自那个基础页面。

整个网站的所有页面,包括登录页面,都是主页面的子页面。

经过一些测试,我已确定引起错误的原因(尽管我不知道为什么会这样)。

在所有包含以下标签的页面上,错误不会发生

<%@ MasterType VirtualPath="~/MasterPages/MainMaster.master" %>

在所有不包含该行的页面上,错误确实发生。这是在整个应用程序中都存在的问题。我只在需要引用MasterPage上的控件的页面上添加了标签。

因此,我想将该行添加到所有页面上并完成。但是当我添加那行时,我遇到了编译错误: 'object'不包含'Master'的定义。

这个错误来自我已经在其上添加了“MasterType”声明的ASPX页面相关的designer.cs文件。

我强制重新生成了设计文件,但没有改变任何内容。我比较了登录页面(login.aspx)(正常工作)和默认页面(default.aspx)(不工作)中设计文件中Master引用的内容,但它们完全相同。

由于我真的希望能够在每个页面上都不必添加"MasterType"声明,并且由于这种“修复”方式也不起作用,是否有人知道为什么在aspx文件中没有"MasterType"声明会导致解析器错误?有没有解决办法?

示例代码:

这是login.aspxlogin.aspx.cs的代码,没有错误地运行:

Login.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/MainMaster.master" AutoEventWireup="true" Inherits="SOME.NAMESPACE.MyApplicationName.WebApplication.Login" Codebehind="Login.aspx.cs" %>
<%@ MasterType VirtualPath="~/MasterPages/MainMaster.master" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder" Runat="Server">
    <table>
        <tr>
            <td>
                <asp:UpdatePanel ID="upLogin" runat="server">
                    <ContentTemplate>
                        <asp:Panel ID="Panel1" runat="server" DefaultButton="Login1$LoginButton">
                            <asp:Login ID="Login1" runat="server" LoginButtonStyle-CssClass="button" 
                                TextBoxStyle-CssClass="textBoxRequired" 
                                TitleTextStyle-CssClass="loginTitle"  >
                            </asp:Login>
                        </asp:Panel>
                    </ContentTemplate>
                </asp:UpdatePanel>
                    <asp:UpdatePanel ID="upPasswordRecovery" runat="server">
                        <ContentTemplate>
                            <asp:PasswordRecovery ID="PasswordRecovery1" runat="server" 
                                SubmitButtonStyle-CssClass="button" TitleTextStyle-CssClass="loginTitle" 
                                SuccessText="Your new password has been sent to you."
                                UserNameInstructionText="Enter your User name to reset your password." />
                        </ContentTemplate>
                </asp:UpdatePanel>
            </td>
        </tr>
    </table>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="SideBarPlaceHolder" Runat="Server">
    <h2>Login</h2>
    <asp:Button ID="btnCreateAccount" runat="server" Text="Create Account" OnClick="btnCreateAccount_Click" CausesValidation="false" />
</asp:Content>

Login.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SOME.NAMESPACE.MyApplicationName.WebApplication;
using SOME.NAMESPACE.MyApplicationName.Bll;

namespace SOME.NAMESPACE.MyApplicationName.WebApplication
{
    public partial class Login : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Login1.Focus();
        }
        
        protected void btnCreateAccount_Click(object sender, EventArgs e)
        {
            Page.Response.Redirect("~/CreateUser/default.aspx");
        }
    }
}

这是 default.aspxdefault.aspx.cs 的代码,在Web浏览器中查看时会出现解析器错误。

Default.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPages/MainMaster.master" AutoEventWireup="True" Inherits="SOME.NAMESPACE.MyApplicationName.WebApplication._Default" Codebehind="Default.aspx.cs" %>
<%@ MasterType VirtualPath="~/MasterPages/MainMaster.master" %>
<asp:Content ID="MainContent" ContentPlaceHolderID="ContentPlaceHolder" Runat="Server">
<div class="post">
    <h2 class="title">Announcements</h2>
    <p class="meta">Posted by Amanda Myer on December 15, 2009 at 10:55 AM</p>
    <div class="entry">
        <p>The MyApplicationName CMDB will be down for maintenance from 5:30 PM until 6:30 PM on Wednesday, December 15, 2009.</p>
    </div>
    <p class="meta">Posted by Amanda Myer on December 01, 2009 at 1:23 PM</p>
    <div class="entry">
        <p>The MyApplicationName CMDB is officially live and ready for use!</p>
    </div>
</div>
</asp:Content>
<asp:Content ID="SideBarContent" ContentPlaceHolderID="SideBarPlaceHolder" Runat="Server">
    <img src="images/MyApplicationName.jpg" alt="MyApplicationName Gremlin" width="250"/>
</asp:Content>

Default.aspx.cs

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using SOME.NAMESPACE.MyApplicationName.Bll;
using SOME.NAMESPACE.MyApplicationName.WebApplication;

public partial class _Default : BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}
11个回答

63
我弄明白了。 问题是项目中仍有一些页面没有转换为在Web应用程序项目中所需的“命名空间”。 我想,如果还有这些页面,它就不会编译,但是如果页面没有引用外部内容,它似乎不会出错。所以当它说它没有继承自“System.Web.UI.Page”时,那是因为运行时实际上找不到“BasePage”类,因为页面本身不在WebApplication命名空间中。 我逐个检查了所有页面,并确保它们正确地添加到WebApplication命名空间中,现在它不仅可以无错误编译,而且正常显示。 耶! 从网站转换为Web应用程序项目真是一场考验!

14

我曾经遇到过这个问题,因为我从一个ASP.Net应用程序中复制了一个(相当通用的)网页到一个新应用程序中。

我修改了相关的命名空间指令,以反映文件的新位置...但是...我忘记在aspx页面本身中更改Inherits参数。

<%@ Page MasterPageFile="" StylesheetTheme="" Language="C#"
    AutoEventWireup="true" CodeBehind="MikesReports.aspx.cs" 
    Inherits="MikesCompany.MikesProject.MikesReports" %>

我改变了Inherits参数后,错误消失了。


4
寻找这个:
在您的项目中,任何一个页面都有缺失或不同的命名空间...
如果您的项目中有任何一个页面带有<NO Namespace>,或者与Default.aspx不同的命名空间,您将会得到这个提示。
Cannot load Default.aspx",

或者这样说: "Default.aspx不属于这里"。
另外:
如果你在解决方案/项目中有一个重定向到一个页面,而被重定向的页面的命名空间有问题,直到你尝试运行时才会出现编译错误。
如果移除或注释掉重定向,错误就会消失...

3

对于我而言,在所有页面上都有命名空间,但以上解决方案均未能解决问题。我的问题在于:

<%@ Page Language="C#" 
AutoEventWireup="true" 
CodeBehind="xxx.aspx.cs" 
Inherits="xxx.xxx.xxx" 
MasterPageFile="~masterurl/default.master" %>

接着,在我的 aspx.cs 文件中,命名空间与 Inherits 标签不匹配。因此,需要进行调整。

namespace xxx.xxx.xxx

.cs 文件中匹配 Inherits

3
我已经复制并重命名了页面(aspx / cs)。页面名称为“mainpage”,因此cs文件顶部的类名如下:

enter image description here

将类重命名后,此错误得到解决。


谢谢,帮了我很大的忙。 - asmgx

1

我遇到了类似的错误,但不是由于转换...

System.Web.HttpException: 'Namespace.Website.MasterUserPages' 在此处不被允许,因为它没有扩展类 'System.Web.UI.MasterPage'

我也在扩展 MasterPage 类。

这个错误是由于我的主页面本身存在一个简单的编译错误:

System.Web.HttpCompileException: c:\directory\path\Website\MasterUserPages.Master(30): error CS1061: 'ASP.masteruserpages_master' 不包含 'btnHelp_Click' 的定义,也没有接受类型为 'ASP.masteruserpages_master' 的第一个参数的扩展方法 'btnHelp_Click'(是否缺少 using 指令或程序集引用?)

直到我将 MasterPage 移动到根网站文件夹中,我才能看到这个错误。解决了这个问题后,我就可以将我的 MasterPage 放回我想要的文件夹中了。


0

我从 Web 应用程序中删除了想要与主页面链接的网页,然后在项目中添加了新的网页,接着设置了主页面(最初我是将网站上的网页复制到 Web 应用程序中以便复制 aspx 页面(我正在将网站转换为项目的 Web 应用程序))。


0

您可以随时重构命名空间,它将同时更新所有页面。选择命名空间,右键单击并从下拉菜单中选择“重构”。


0

记住,对于C#而言,继承是大小写敏感的(但对于vb.net则不是)

我是通过艰难的方式发现这一点的。


0
对我来说,解决方法是不同的。相应的aspx页面已经从项目中卸载,我将其添加回去,错误就消失了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接