为什么我们只能访问aspx或ascx中的Protected和Public方法?

时间:2014-12-09 16:16:02

标签: c# asp.net inheritance webforms

我有一个ASP.net webform项目,当我有protectedpublic方法时,我可以通过aspx中的内联代码调用它们,但我无法调用{{1} } 方法。为什么?它的行为类似于 inheritance 类。它与继承有关吗?

我的ASPX:

private

C#代码:

<%@ 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>

2 个答案:

答案 0 :(得分:3)

  

为什么我们只能访问aspx或中的Protected和Public方法   ASCX?

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

这带来了你的第二个问题:

  

但是aspx文件是一个类吗?

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

  

请参阅:Codebehind and Compilation in 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文件   独立于codebehind类编译。完成了   图片,你需要一些方法来生成兄弟的部分类   包含编译期间的控制变量声明或   部署,因为这总是在过去按需完成   对请求的回应。输入ASP.NET编译器。

答案 1 :(得分:2)

  

它的行为类似于继承类。

它的行为方式是因为它是继承。 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()不可以访问。