为什么我们只能在 aspx 或 ascx 中访问受保护方法和公共方法

本文关键字:方法 受保护 访问 ascx 我们 aspx 为什么 | 更新日期: 2023-09-27 18:33:40

我有一个 ASP.net 的Web表单项目,当我有一个protectedpublic的方法时,我可以从aspx中的内联代码调用它们,但我不能调用private方法。为什么?它的行为类似于继承类。它与继承有关吗?

我的ASPX:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ViewFamilyTree.aspx.cs" Inherits="Mobini.WebForms.ViewFamilyTree" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>
        <%= GetHelloWorlds_Protected() %> <%-- Works --%>
        <%= GetHelloWorlds_Public() %> <%-- Works --%>
        <%= GetHelloWorlds_Private() %> <%-- Error: is inaccessible due to its protection level --%>
    </title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>

C# 代码:

namespace Mobini.WebForms
{
    public partial class ViewFamilyTree : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        private string GetHelloWorlds_Private()
        {
            return "Hello Worlds";
        }
        protected string GetHelloWorlds_Protected()
        {
            return "Hello Worlds";
        }
        public string GetHelloWorlds_Public()
        {
            return "Hello Worlds";
        }
    }
}

为什么我们只能在 aspx 或 ascx 中访问受保护方法和公共方法

为什么我们只能访问 aspx 中的受保护和公共方法或 ASCX?

对你的问题的简单回答是:是的,这是因为继承。由于在aspx文件中,有一个指令指定要继承的类(通常是类背后的代码(

这就引出了你的第二个问题:

但是 aspx 文件是一个类吗?

是的。编译时,将为aspx文件生成一个类。在 ASP.Net 2.0 的原始实现中,类aspx和类背后的代码是与 winform 相同的部分类。但后来由于灵活性而发生了变化。

请参阅:ASP.NET 2.0 中的代码隐藏和编译

在这一点上,您可能想知道为什么 ASP.NET 团队费心 对这个新的代码隐藏模型完全使用继承。ASP.NET 可以 轻松生成所有控制变量声明 将.aspx文件中的呈现方法作为分部类 然后可以与简化的代码隐藏类合并。这是 正是Windows Forms在.NET Framework 2.0中的工作方式。所有 设计器生成的代码被放置在同级分部类中,该分部类 然后与应用程序逻辑和事件处理程序合并到 单个 Form 派生类,在 机器生成的代码和开发人员代码,无需求助于 遗产。

好吧,事实证明,代码隐藏的原始实现 ASP.NET 2.0 正是这样做的——代码隐藏类只是部分 与已分析的.aspx文件类定义合并的类。它 简单有效,但不幸的是,不够灵活。这 此模型的问题在于无法再部署 预编译二进制程序集中的代码隐藏文件以及 完整的.aspx文件,因为它们现在必须同时编译 时间(使用分部类时的限制是所有分部类 类的各个部分必须在单个编译期间合并,并且 类定义不能跨程序集(。此限制是 许多开发人员无法接受,因为他们已经习惯了 能够部署二进制代码隐藏程序集以及完整的.aspx 然后可以就地更新的文件,而无需 重新 编译。事实上,这是Visual 中默认使用的确切模型。 Studio .NET 2003,因此在实践中非常普遍。

由于重新引入继承模型并转移 分部类到基类中,现在可以部署.aspx文件和 独立于代码隐藏类编译。要完成 图片,你需要一些方法来生成同级分部类 在编译期间包含控制变量声明或 部署,因为这在过去总是按需完成 对请求的响应。输入 ASP.NET 编译器。

它的行为类似于继承类。

它的行为方式是因为它

是继承。ASP.NET 编译器的作用是从您创建的视图文件中继承您的"代码隐藏文件"。

对于您的示例,您有CodeBehind="ViewFamilyTree.aspx.cs" Inherits="Mobini.WebForms.ViewFamilyTree",因此创建了一个如下所示的类:

public class MyView : Mobini.WebForms.ViewFamilyTree
{
    protected internal override void Render(HtmlTextWriter writer)
    {
         writer.WriteLine("My view content header");
         writer.WriteLine(GetHelloWorlds_Protected());
         writer.WriteLine(GetHelloWorlds_Public());
         writer.WriteLine(GetHelloWorlds_Private());
         writer.WriteLine("My view content footer");
    }
}

因此,GetHelloWorlds_Protected()GetHelloWorlds_Public()是可访问的,但GetHelloWorlds_Private()不是。