如果我们想将页面转换为用户控件,那么我们还应该执行以下操作:
“如果您不使用代码隐藏模型,请确保仍然通过提供 ClassName 属性在 Control 指令中包含类名。这样,使用该控件的网页就可以是强类型的,从而允许它访问您添加到控件中的属性和方法。”
我不确定我是否理解上面的引言:
也就是说,如果我们不使用代码隐藏类,那么ascx类将直接从UserControl类派生! 因此,如果我们不使用类背后的代码,那么就不会有任何方法或属性添加到控件中,那么为什么网页在访问任何用户控件的属性和方法时会出现问题呢?那么为什么我们需要在 Control 指令中包含类名呢?
谢谢
最佳答案
我想我应该澄清一下编译模型是如何工作的。首先,您可以在一个 .ascx
中编写所有内容(包括 C# 代码)。文件并通过指定 UserControl
继承您想要的任何类(最终继承自 Inherits
)属性(或者您可能想省略它)并且没有 ClassName
属性。如果执行此操作,您仍然可以从 .aspx
访问属性。使用此控件的文件。问题是,您不能使用 .aspx
代码隐藏文件中的类。直接查看页面(如果有的话)。通过指定ClassName
,如果您使用的是Visual Studio的Website项目模型,可以从.aspx.cs
访问。文件也。请注意,这在 Web 应用程序项目模型中不起作用,因为每个 .cs
文件将提前编译(在 .ascx
文件之前)。在这种情况下,甚至 ClassName
属性没有多大帮助。
无论如何,这些属性都不是必需的。您始终可以使用 .ascx
中任何位置定义的属性或.ascx.cs
文件包含在.aspx
中的页面中文件(但不总是 .aspx.cs
文件)。
编辑以解决问题的更新:
A)从您的源代码来看,您似乎在此处使用网站模型。请注意,我提到过您不能直接使用类。我同意这种说法可能有点误导。我想注意的是,没有 ClassName
,ASP.NET 将为您的用户控件类选择一个名称,但不保证该名称。虽然您可以使用生成的名称,但根本不建议这样做。您应该将其视为匿名类型,您可以使用实例但不能提及名称。在您的示例中,您基本上引用了一个实例(它是在 .aspx
标记上构造的),而不是 类,这是可以的。
B) 你说的是正确的。无论您在ascx.cs
中声明什么Web 应用程序中的 .aspx.cs
可见和.aspx
。我所说的是您在 .ascx
中声明的属性在 <script runat="server">
标签。 .aspx.cs
将看不到这些内容因为它是预先编译的。
C) ASP.NET 将生成 ClassName
定义的类ASP
中的属性命名空间。您应该使用ASP.Some_Name
反而。我忘记提及一件事:在这种情况下,您应该以某种方式引用 .ascx
在 .aspx
标记;要么带有 Reference
指令 ( <%@ Reference Control="MyControl.ascx" %>
) 指令或带有 Register
指令( <%@ Register TagPrefix="abc" TagName="xyz" Src="MyControl.ascx" %>
)。这将确保 ASP.NET 构建引擎将生成的 .ascx
与 .aspx
位于同一程序集中的类页。
关于c# - 将页面转换为用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/683899/