如何编译aspx?

时间:2012-03-25 09:40:52

标签: asp.net

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

1 个答案:

答案 0 :(得分:9)

这取决于项目类型。使用ASP .Net,您可以创建两种项目:Web Application Project and Web Site Project.

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

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

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

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

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

是否遵循任何层次结构/继承?

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

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" 
         Inherits="WebApplication1._Default" %>

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

的类
public class default_aspx : global::WebApplication1._Default
{

}

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

以下方法是_Default类的方法:

 protected string ToUpper(string source)
        {
            return source.ToUpper();
        }

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

<form id="form1" runat="server">
  <%= ToUpper("Microsoft") %>
</form>

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

<% SomeValue = 1; %>
<%= SomeValue %>

在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>

这里我声明一个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 
          }
     }
}

并更改Inherits值:

<%@ Page Language="C#" Inherits="WebApplication1.PreviewPage" %>

正在创建aspx作为相应的C#代码文件

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

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