两个ASPX页面可以继承类后面的相同代码吗?

时间:2010-09-04 20:58:56

标签: c# .net asp.net code-behind

我刚刚开始学习ASP.NET。根据我的理解,ASP.NET与旧式ASP的不同之处在于,页面的逻辑代码存在于单独的文件中,而不是嵌入在ASP页面中。因此,当用户请求像ShoppingCart.aspx这样的页面时,服务器会在顶部读取指令...

<%@ Page Title="" Language="C#" MasterPageFile="~/Styles/Site.Master" AutoEventWireup="true" CodeBehind="MyShoppingCart.aspx.cs" Inherits="TailspinSpyWorks.MyShoppingCart" %>

这告诉服务器文件中的哪个文件和哪个类与页面相关联。类后面的代码还具有与页面上的每个控件相对应的成员变量,并为代码隐藏文件中的代码提供了一种操作控件的方法。

首先,我能正确理解这一点吗?

其次,一个站点是否可以设置两个具有相同名称控件的独立ASPX页面,这两个页面都有一个指向同一文件和类的指令?你想要这样做吗?两个页面可以具有相同的功能,但具有不同的布局。我认为这可能是一种创建单独的“桌面”和“移动”版本的页面的方法,而不会在文件后面的代码中复制内容。

我想最终我想知道的是,是否有办法定义抽象页面?假设创建一个抽象页面定义,说明页面必须有控件“cart_list”,“total_lbl”,但是然后能够有多个页面从这个抽象页面继承吗?

4 个答案:

答案 0 :(得分:8)

是的,两个页面可以从同一个类继承。就像它可以直接从Page类继承,甚至没有关联的.cs文件(当你的页面不是静态的,但不处理事件或可能需要代码隐藏类的东西时很有用) )。

在实践中,我认为直接从同一个类继承几个ASP.NET页面并不是一个好主意。这不常见,所以:

  • 代码将更难理解,无法扩展,
  • 在Visual Studio中很难管理,特别是涉及事件,控件等时。
  • 会对现有/缺失的控件造成很大的痛苦。查看详细的Guffa answer below

如果您网站的多个页面共享相同的逻辑,

  • 每页创建一个类,并从公共父类继承这些类,该父类将包含公共方法和属性,并将继承自Page类。您将获得广泛且易于理解的解决方案。
  • 如果案例是母版页的合适候选人,则创建母版页。

答案 1 :(得分:3)

如果您使用的是.NET 4.0,则可能需要检查this。它描述了Request.Browser.IsMobileDeviceRequest.Browser.MobileDeviceModel

您可以将一些逻辑放入代码隐藏或ASPX标记中,以检测您是否在移动设备上运行。这将允许您将所有代码放在一个文件中,但可以选择要显示的HTML元素等。

答案 2 :(得分:3)

  

我刚刚开始学习ASP.NET。根据我的理解,ASP.NET与旧式ASP的不同之处在于,页面的逻辑代码存在于单独的文件中,而不是嵌入在ASP页面中

经典ASP和ASP.NET在很多方面有所不同,主要方式是经典ASP页面(大多数情况下)是基于脚本的过程非托管代码,而ASP.NET页面是编译,管理的,和事件驱动。通常,ASP.NET页面将标记和服务器端代码分成两个单独的文件,但这不是必需的。很可能将服务器端代码放在.aspx页面的&lt; script runat =“server”&gt;中。块。

  

顶部的指令......

     

&lt;%@ Page Title =“”Language =“C#”MasterPageFile =“〜/ Styles / Site.Master”AutoEventWireup =“true”CodeBehind =“MyShoppingCart.aspx.cs”Inherits =“TailspinSpyWorks.MyShoppingCart”% &GT;

     

告诉服务器文件中的哪个文件和哪个类与页面相关联。类后面的代码还具有与页面上的每个控件相对应的成员变量,并为代码隐藏文件中的代码提供了一种操作控件的方法。首先,我能正确理解吗?

是的,你理解正确。

  

第二,网站是否可以设置两个具有相同名称控件的独立ASPX页面,这两个页面都有一个指向同一文件和类的指令?

是的,你可以这样做。

  

你甚至想要这样做吗?

可能不是。实际上,即使有两个单独的ASPX页面都继承自同一个基页,也没有任何东西可以强制它们拥有相同的控件集。实际上,它们可以有不同的控件,页面将呈现而不会出错。 (如果您尝试访问其中一个页面中不存在的代码隐藏中的控件,则会出现运行时错误。)

  

我想最终我想知道的是,是否有办法定义抽象页面?假设创建一个抽象页面定义,说明页面必须有控件“cart_list”,“total_lbl”,但是然后能够有多个页面从这个抽象页面继承吗?

没有(据我所知)实现这一目标的方法。然而,可能接近的是拥有一个基本的Page类,即使你手头没有这个特定的场景,也可以使用它。有关创建和使用基页类的更多信息,请参阅:Using a Custom Base Class for your ASP.NET Pages' Code-Behind Classes

快乐编程!

答案 3 :(得分:1)

是的,没有。

您可以对不同的页面使用相同的类,但页面控件和类中的变量之间的绑定并不严格。

控件引用将简单地分配给变量(如果它们存在且具有匹配类型),但您不能对页面必须包含某些控件进行任何限制。但是,您可以检查变量是否已分配,或者它们是否包含代码中的第一个空引用。

在某些罕见的场合,我在不同的页面上使用了同一个类,但这不常见。通常这样做几乎没有什么好处,如果你想重用页面中的代码,你可以将它放在一个类文件中并从单独的页面中使用它。