c# - 将页面转换为用户控件

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

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

“如果您不使用代码隐藏模型,请确保仍然通过提供 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/

相关文章:

c# - 如何在运行时定义 C# 对象?

C#构造函数执行顺序

c# - LINQ 组合查询

c# - Visual Studio 2008 奇怪的构建错误(类型与导入类型冲突)

c# - ASP.NET MVC 5 中的自定义错误页面

c# - 在 Visual Studio C# 中以 MS Access 数据库形式获取 OLE(位图)对象,我的代码有什么问题?

.net - VirtualBox 上的共享文件夹未使用 Visual Studio 2015(网站项目)打开

c# - WMI 查询的 select 子句中的数学运算

asp.net - 如何在Gridview中对齐文本?

c# - 无法将自定义 .css 添加到嵌套的 ASP.NET 表格单元格控件