Я недавно преобразовал проект веб-сайта в проект веб-приложения в Visual Studio 2008. Я наконец получил его для компиляции, и первая страница (экран входа в систему) отображалась как обычно, но затем, когда она перенаправлялась на страницу 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.
Итак, я подумал, что просто добавлю эту строку на все мои страницы и покончу с этим. Но когда я добавляю эту строку, я получаю ошибку компиляции:
«объект» не содержит определения «мастер»
Эта ошибка исходит из файла designer.cs, связанной со страницей ASPX, к которой я добавил объявление "MasterType".
Я заставил пересобрать файл конструктора, но это ничего не меняет. Я сравнил содержание ссылки Master в файлах конструктора между login.aspx (работает) и default.aspx (не работает), но они точно такие же.
Так как я действительно хотел бы заставить его работать без необходимости добавлять объявление «MasterType» на каждую страницу, и поскольку это «исправление» не работает в любом случае, кто-нибудь знает, почему не имеет объявление «MasterType» файл aspx вызывает ошибку парсера? Есть ли исправление для этого?
Пример кода:
Вот код для login.aspx и login.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.aspx и default.aspx.cs, который выдает ошибку синтаксического анализатора при просмотре в веб-браузере:
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)
{
}
}
Спасибо!