如何编译aspx?

dee*_*een 7 asp.net

如何编译.aspx和aspx.cs文件?它会是两个程序集还是这两个文件组合在一起并将作为一个程序集创建?它遵循任何层次结构/继承吗?.aspx是作为一个相应的C#代码文件创建的(只有这样我们才能创建一个程序集吗?如果我错了,请纠正我!)作为windows form designer.cs文件中的一个?

Adr*_*ode 10

这取决于项目类型.使用ASP .Net,您可以创建两种项目:Web应用程序项目和Web站点项目..

如何编译.aspx和aspx.cs文件?

使用Web Application项目,您可以aspx将此项目中的文件,用户控件和其他代码后面的代码编译为一个单独的dll,并将其部署在服务器上.

随着Web Site Project您只需复制源代码在服务器上,ASP .Net将处理编辑为您服务.Web站点项目在App_Code文件夹中保存自定义类的源代码(您必须在该链接上阅读有关这些内容的更多信息)

它是两个程序集还是这两个文件组合在一起并将作为一个程序集创建?

在所有这些情况下,aspx, ascx文件中找到的代码都不是由您编译的(使用Visual Studio等).ASP .Net解析这些文件并创建一个存储在其临时文件夹中的DLL."aspx,ascx"dll(虽然它可能不止一个)是与使用Visual Studio创建的文件不同的文件(我认为与从App_Code文件夹创建的文件不同,因为该代码不能访问代码页面中的代码).

它遵循任何层次结构/继承吗?

是.解析和编译页面时,生成的类将继承在@Page指令中找到的"Inherits"属性命名的类.

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" 
         Inherits="WebApplication1._Default" %>
Run Code Online (Sandbox Code Playgroud)

ASP .Net解析Default.aspx文件并生成一个继承的类 WebApplication1._Default

public class default_aspx : global::WebApplication1._Default
{

}
Run Code Online (Sandbox Code Playgroud)

从标记生成的类继承了我们编写的类(通常是后面的代码中的aspx.cs文件),我们可以自由地使用它的成员或方法.

以下方法是_Default类的方法:

 protected string ToUpper(string source)
        {
            return source.ToUpper();
        }
Run Code Online (Sandbox Code Playgroud)

然后在标记中我们可以调用:

<form id="form1" runat="server">
  <%= ToUpper("Microsoft") %>
</form>
Run Code Online (Sandbox Code Playgroud)

我们甚至可以用标记来写:

<% SomeValue = 1; %>
<%= SomeValue %>
Run Code Online (Sandbox Code Playgroud)

SomeValue,它至少是_Default类的受保护属性.

我们也可以自由地声明成员并在标记中编写服务器代码:

<head runat="server">

    <script runat="server" language="C#">
        private int someCounter = 10;
    </script>

</head>
<body>
    <% for (var i = 0; i < someCounter; i++)
       { %>
        <p>
            Paragraph number:<%= i %>
       </p>
    <% } %>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这里我声明一个someCounter字段并用它来写10个段落.当然,这不是推荐的做这种事情的方法.由于someCounter是生成的类的成员,因此无法在后面的代码中访问它.

这种架构还有另一个巨大(更实际)的优势.假设网站中的某些页面是静态的(about.aspx,privacy.aspx等),它们使用相同的主页面.本页后面的代码不会改变.这意味着我们可以创建其他页面并进行部署,而无需对后面的代码进行另一次编译(此方面适用于Web应用程序项目).此外,在上线之前,我们可能只允许一个人看到这些页面.因此,为了实现这一点,我们创建了一个PreviewPage类

public PreviewPage: System.Web.Page
{
     public  PreviewPage()
     {
          this.Load += (o, e) => {
               // code here to see if the authenticated user has the right to see the page
              // if not, redirect the user to another page 
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

并改变Inherits价值:

<%@ Page Language="C#" Inherits="WebApplication1.PreviewPage" %>
Run Code Online (Sandbox Code Playgroud)

aspx被创建为相应的C#代码文件

指令中的Language属性@Page指示用于编译aspx/ascx文件的语言.所以你可以在aspx文件中实际使用VB.Net并用C#编译器编译网站.

这是另一个编译,与Visual Studio不同,它使用不同的选项.这就是为什么在web.config中有选项来设置compilationModeto Debug/Release并指示编译器使用其他可用选项.