我有一个ASP.net webform项目,当我有protected
或public
方法时,我可以通过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>
答案 0 :(得分:3)
为什么我们只能访问aspx或中的Protected和Public方法 ASCX?
对您的问题的简单回答是:是的,这是因为继承。因为在aspx文件中,有一个指令指定要继承的类,(通常是类后面的代码)
这带来了你的第二个问题:
但是aspx文件是一个类吗?
是。在编译时,将为aspx
文件生成一个类。在ASP.Net 2.0的原始实现中,aspx
类和类后面的代码是相同的部分类,如winform。但后来由于灵活性而改变了。
请参阅: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()
不可以访问。