如果我们想将页面转换为用户控件,那么我们还应该执行以下操作:
“如果您不使用代码隐藏模型,请确保通过提供ClassName属性仍在Control指令中包含类名。这样,使用控件的网页可以强类型化,这使它可以访问您添加到控件中的属性和方法。“
我不确定我是否理解上述引用:
即,如果我们不使用类后面的代码,那么ascx类将直接从UserControl类派生! 因此,如果我们不使用类后面的代码,那么控件中不会添加任何方法或属性,那么为什么网页在访问任何用户控件的属性和方法时会出现问题呢?那么为什么我们需要在Control指令中包含一个类名?
感谢名单
答案 0 :(得分:2)
我想我应该澄清编译模型是如何工作的。首先,您可以在一个.ascx
文件中编写所有内容(包括C#代码),并通过指定UserControl
属性继承自您想要的任何类(最终继承自Inherits
)(或者你可能想省略它)并且没有ClassName
属性。如果执行此操作,仍可以从使用此控件的.aspx
文件中访问属性。问题是,您不能直接在.aspx
页面的代码隐藏文件中使用该类(如果有的话)。通过指定ClassName
,如果您使用的是Visual Studio的网站项目模型,则也可以从.aspx.cs
文件访问它。请注意,这在Web应用程序项目模型中不起作用,因为每个.cs
文件将在时间之前(.ascx
文件之前)进行编译。在这种情况下,即使ClassName
属性也无济于事。
在任何情况下,严格来说都不需要任何属性。您始终可以使用.ascx
文件中页面中包含的.ascx.cs
或.aspx
文件中定义的属性(但不总是.aspx.cs
文件)。
编辑以解决问题的更新:
A)从您的源代码中,您似乎在这里使用网站模型。请注意,我提到您不能直接使用类。我同意这种说法可能有点误导。我想要注意的是,如果没有ClassName
,ASP.NET将为您的用户控件类选择一个名称,但不保证该名称。虽然可以使用生成的名称,但根本不建议使用。你应该把它当作一个匿名类型,你可以使用一个实例,但不能提到一个名字。在您的示例中,您基本上是引用一个实例(在.aspx
标记上构建),而不是类,这是正常的。
B)你说的是对的。您在ascx.cs
和.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
页面相同的程序集中。
答案 1 :(得分:1)
如果我们不使用课程背后的代码, 那么就没有任何方法或者 添加到控件的属性,为什么呢 网页是否会有访问权限 任何用户控件的属性和 方法?那么我们为什么需要呢 在Control中包含一个类名 指令