Niedawno przekonwertowałem projekt strony internetowej na projekt aplikacji internetowej w Visual Studio 2008. W końcu mam to skompilować, a pierwsza strona (ekran logowania) wyświetlane jako normalne, ale wtedy, gdy przekierowany do strony Default.aspx, otrzymałem błąd:Błąd analizatora składni: "_Domyślnie" nie jest tutaj dozwolone, ponieważ nie rozszerza klasy "System.Web.UI.Page" i deklaracja MasterType
Parser Error Message: 'SOME.NAMESPACE.MyApplicationName.WebApplication._Default' is not allowed here because it does not extend class 'System.Web.UI.Page'.
Wszystkie moje strony dziedziczą z klasy o nazwie "BasePage", która rozszerza System.Web.UI.Page. Oczywiście problem nie dotyczy tej klasy, ponieważ strona login.aspx wyświetla się bezbłędnie, a także dziedziczy po tej stronie głównej.
Wszystkie strony w witrynie, w tym strona logowania, należą do dzieci strony wzorcowej.
Po kilku testach ustaliłem, co powoduje błąd (choć nie wiem DLACZEGO to robi).
Na wszystkich stronach, na których mam następującą etykietę, błąd NIE występuje.
<%@ MasterType VirtualPath="~/MasterPages/MainMaster.master" %>
Na wszystkich stronach, które nie zawierają tej linii, wystąpi błąd. Dotyczy to całej aplikacji. Mam tag tylko na stronach, na których było zapotrzebowanie na elementy sterujące na stronie MasterPage.
Więc pomyślałem, że po prostu dodaję tę linię do wszystkich moich stron i skończę z tym. Ale kiedy dodaję tę linię, pojawia się błąd kompilacji: "Obiekt" nie zawiera definicji "Master"
Ten błąd pochodzi z pliku designer.cs powiązanego ze stroną ASPX, którą dodałem Deklaracja "MasterType" dla.
Wymuszałem przebudowę pliku projektanta, ale to niczego nie zmienia. Porównałem zawartość odwołania głównego w plikach projektanta między login.aspx (working) i default.aspx (nie działa), ale są one dokładnie takie same.
Ponieważ bardzo chciałbym, aby działało bez dodawania deklaracji "MasterType" do każdej strony, a ponieważ "poprawka" i tak nie działa, czy ktoś wie dlaczego nie ma deklaracji "MasterType" w pliku aspx powoduje błąd parsera? Czy jest na to poprawka?
Przykład Kod:
Oto kod dla Login.aspx i login.aspx.cs który działa bezbłędnie:
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");
}
}
}
Oto kod dla default.aspx i default.aspx.cs, który rzuca błąd parsera gdy w przeglądarce internetowej:
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)
{
}
}
Dzięki!