1. ホーム
  2. c#

[解決済み] パーサーエラー: '_Default' はクラス 'System.Web.UI.Page' & MasterType 宣言を拡張しないため、ここでは許可されません。

2022-02-17 01:53:46

質問

最近、Visual Studio 2008でWebサイトのプロジェクトを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'.

私のすべてのページは、System.Web.UI.Page を継承する "BasePage" というクラスから継承されています。 login.aspx ページはエラーなしで表示され、またそのベースページを継承しているので、明らかに問題はそのクラスではありません。

ログインページを含むサイト上のすべてのページは、マスターページの子ページです。

いくつかのテストの後、私はそれがエラーを引き起こすものであることを決定しました(それがなぜそうするのか分かりませんが)。

以下のタグがあるすべてのページで、エラーは発生しません。

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

その行を含まないすべてのページで、エラーが発生します。 これは、アプリケーション全体を通してです。 MasterPageのコントロールを参照する必要があるページにのみ、このタグがあります。

そこで、すべてのページにその行を追加して終わりにしようと思いました。 しかし、その行を追加すると、コンパイル・エラーが発生します。 'object' には 'Master' の定義がありません。

このエラーは、私が "MasterType" 宣言を追加した ASPX ページに関連する designer.cs ファイルから発生しています。

デザイナーファイルを強制的に作り直しましたが、何も変わりません。login.aspx(動作中)とdefault.aspx(動作しない)でデザイナーファイルのMaster参照の内容を比較しましたが、全く同じでした。

私はすべてのページに "MasterType" 宣言を追加することなく動作するようにしたいので、そしてその "fix" がとにかく動作しないので、誰か aspx ファイルに "MasterType" 宣言を持たないことがなぜパーサーエラーを引き起こすかを知っていますか? この修正方法はあるのでしょうか?

コード例です。

以下は、エラーなく動作しているlogin.aspxとlogin.aspx.csのコードです。

ログイン.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>

ログイン.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.aspx と default.aspx.cs のコードです。

デフォルト.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>

デフォルト.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)
    {
    }
}

ありがとうございました。

解決方法は?

わかったんだ。 問題は、Webアプリケーションのプロジェクトで必要な"namespaces"を使うように変換されていないページが、プロジェクト内にまだいくつかあったことです。 そのようなページが残っているとコンパイルできないと思ったのでしょうが、そのページが外部から何も参照していなければ、騒ぐことはないようです。 つまり、ページが "System.Web.UI.Page" から継承していないと言ったとき、それはページ自体が WebApplication 名前空間になかったので、実行時にクラス "BasePage" を実際に見つけることができなかったからです。 私はすべてのページを一つずつ調べて、それらが適切にWebApplication名前空間に追加されていることを確認しました。そして今、それは問題なくコンパイルされるだけでなく、正常に表示されるようになりました。

ウェブサイトからウェブアプリケーションに変換するプロジェクトは、なんと試練に満ちていることでしょう。