将页面转换为用户控件

时间:2009-03-25 23:14:27

标签: c# .net asp.net user-controls user-interface

如果我们想将页面转换为用户控件,那么我们还应该执行以下操作:

“如果您不使用代码隐藏模型,请确保通过提供ClassName属性仍在Control指令中包含类名。这样,使用控件的网页可以强类型化,这使它可以访问您添加到控件中的属性和方法。“


我不确定我是否理解上述引用:

即,如果我们不使用类后面的代码,那么ascx类将直接从UserControl类派生! 因此,如果我们不使用类后面的代码,那么控件中不会添加任何方法或属性,那么为什么网页在访问任何用户控件的属性和方法时会出现问题呢?那么为什么我们需要在Control指令中包含一个类名?

感谢名单

2 个答案:

答案 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中包含一个类名   指令

  1. 您可以在.ascx / .aspx文件中嵌入任何代码,在新的asp.net mvc模型中,默认情况下不会有任何代码。我认为后面的代码是可选的,它只是将一个类分成两个部分的好方法。部分类用于后面的代码。
  2. 即使您不使用类后面的代码,您仍然可以从基本控件继承属性。然后通过声明一个类,您也可以访问这些属性。