【问题标题】:asp.net Can I force every page to inherit from a base page? Also should some of this logic be in my master page?asp.net 我可以强制每个页面都从基本页面继承吗?也应该在我的母版页中包含一些这样的逻辑吗?
【发布时间】:2011-01-14 09:39:23
【问题描述】:

我有一个带有基本页面的网络应用程序。

每个页面都需要从这个基本页面继承,因为它包含他们都需要的属性以及处理登录权限。

我的基本页面有一些属性,例如:IsRole1、IsRole2、currentUserID、Role1Allowed、Role2Allowed。

在每个页面的初始化中,我设置了属性“Role1Allowed”和“Role2Allowed”

 Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

    Role1Allowed = True
    Role2Allowed= False

End Sub

然后基本页面决定用户是否需要重定向。

'示例代码不完全是什么,错误给出了想法

 Protected Overridable Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
          If Role1Allowed And Not Role1 Then
'Redirect somewhere
          End If 
       End Sub

如果页面中需要其他任何内容,则该页面必须覆盖此页面加载,但请确保他们首先调用基本页面加载。

  Protected Overrides Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    MyBase.Page_Load(sender, e)
    If Not IsPostBack Then
        BindGrid()
    End If
End Sub

页面也可以访问其他属性(IsRole1、IsRole、currentUserID),因此可以根据用户决定是否需要执行某些操作。

(我希望这是有道理的)

好的,我有 2 个问题

  1. 此功能应该在基本页面中还是应该在主页面中,如果是,我如何访问所有属性?
  2. 由于有多个人在处理此项目并创建页面,因此有些人忘记了从该基本页面继承,或者在覆盖它时调用基本页面加载。 有没有办法强迫他们这样做?

【问题讨论】:

    标签: asp.net vb.net inheritance


    【解决方案1】:
    1. 是的,它应该在基本页面中。在我看来,母版页仅用于设计目的,纯粹是视觉布局。当然,其中一些布局可能取决于权限,但它本身不会做出任何决定,这完全取决于基页类。这具有使用不同母版页而不会丢失页面类中的功能的额外优势。哪个不错。

    2. AFAIK,您必须手动更改“代码隐藏”页面类的基类。要检测开发人员没有从适当的类派生的问题:

      • 告诉他们注意 (:P)
      • 使用反射编写一些代码,检查程序集中的页面,如果不是从正确的类派生,则会抛出某种警告文本。如果开发人员的名字可以包含在此输出中,则可以加分。
      • 关于确保调用方法,您可以设置某种仅在该方法中设置的标志,如果尚未设置,则在渲染链的下游抛出异常。
      • 更好的是,无论开发人员决定做什么,都要确保调用它。

    【讨论】:

    • 谢谢@moo-juice!我同意关注:),但我也是罪魁祸首..很容易忘记!无论页面加载是否已被覆盖,如何确保调用基本页面加载?
    • @Bex,在构造函数中显式地将基页附加到 OnLoad 事件,作为我在浴缸中使用的一种方法,但不确定这是多么“正确”。
    • 果汁,跳过注意部分.. 介绍恐惧管理!团队饮水箱中的五口酒通常适用于倾向于“忘记”的人:)
    • 我希望我可以编辑 cmets。显然,我不会在洗澡时编码(因为存在健康和安全风险),但这是我过去使用过的一种方法。
    【解决方案2】:

    这个功能应该在基本页面中还是应该在主页面中

    两者都可以,但无论哪种方式,您都会遇到同样的问题 - 开发人员可能会忘记从基本页面继承,并且开发人员也可能忘记包含对母版页的引用。你必须决定哪个不太可能发生。母版页也更有可能在非安全页面上使用,因为它们包含网站的常见样式和视觉元素,因此您最好的选择是拥有一个“安全”的基本页面。

    在 master 中,如果是,我将如何访问所有属性?

    如果您将功能嵌入到母版页中,您可以使用常规 aspx 页面后面的代码中的 Page.Master 访问母版的公共属性。

    有没有办法强迫他们这样做?

    代码审查。或者,您可以为 StyleCop 等静态代码分析工具编写规则,并在每次有人将页面签入源存储库时运行它。

    您最好的解决方案可能是一个基类的组合,它实现了您所说的一些基于角色的代码,以及一个应该用于任何新页面的页面模板 - 您已经设置了适当的基类调用模板文件。但这仍然不是万无一失的,在这种情况下,请参考我上面的另一点 - 代码审查和静态代码分析。

    【讨论】:

    • 一个页面模板,没想到!那会更容易记住。如何创建其中之一?
    【解决方案3】:

    正如 Moo-Juice 在他的回答中所说,您不能强制特定类继承其他类。

    但是,使用 HttpModule 您应该能够获取当前的 Page 实例,然后对其类型进行简单检查(在 C# 中为 if (!page is BaseClass))应该知道它是否从基页继承,如果没有则抛出一些错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      相关资源
      最近更新 更多