【问题标题】:Visual inheritance in ASP.NET without master pages没有母版页的 ASP.NET 中的可视继承
【发布时间】:2009-07-29 12:46:13
【问题描述】:

我有一个特定的页面,根据管理员角色,必须插入许多额外的验证控件。但是,我不想冒为其他用户启用验证器的风险。

我在想的是使用某种形式的“视觉继承”,但我不知道该选择哪条路径。也许有从同一个类(从 Page 继承)继承的单独 .aspx 页面?

附注:这必须在 webforms,而不是 mvc 中完成。

额外信息:我试图解决的问题是角色分离和对页面的影响,而不必复制页面并且必须维护两者的任何更改。有些客户可以看到原版页面,管理员可以看到相同的信息,但添加了验证控件。但是,客户端不应看到这些验证控件。还可以看到更多信息,但可以通过使用基于角色的查看某些用户控件来处理。

有人对此有想法吗?

【问题讨论】:

  • 母版页是唯一可以在 ASP.NET 中正常工作的可视继承。

标签: asp.net visual-inheritance


【解决方案1】:

您为什么不想使用母版页?母版页完全符合您的要求 - 它们甚至可以相互“继承”(以某种说法)。

我建议你使用master pages 做你想做的事。

ASP.NET 母版页允许您 创建一致的布局 应用程序中的页面。一个 母版页定义外观 和你想要的标准行为 对于所有页面(或一组 页)在您的应用程序中。你可以 然后创建单独的内容页面 包含您想要的内容 展示。当用户请求 内容页面,它们与 生成输出的母版页 结合母版页的布局 内容来自内容 页面。

【讨论】:

  • 我们也在考虑这个问题,但在这种情况下,问题转移到了内容页面的位置。还是您的意思是文本框将位于母版页上,而验证器(如果需要)位于内容页上?我们的页面上有 100 多个控件,还有网格/列表视图呢?我认为这是一个 nogo 解决方案。
  • 我不明白 - 你想解决什么问题?你会如何更好地解决它?
  • 我在我的问题中添加了一些额外的信息,希望能进一步澄清。
【解决方案2】:

如果您要解决的问题是基于角色的控件查看,并且您正在使用内置的 asp.net 成员资格/角色提供程序,则可以使用 LoginView 控件来管理管理内容的可见性:

<asp:LoginView runat="server" ID="LoginView">
    <RoleGroups>
        <asp:RoleGroup Roles="Admin">
            <ContentTemplate>
                Special Admin content
                <asp:RequiredFieldValidator></asp:RequiredFieldValidator>

            </ContentTemplate>
        </asp:RoleGroup>
    </RoleGroups>
</asp:LoginView>

【讨论】:

  • 如果有 100 个这样的控件,这不会大大降低性能和可读性吗?
  • 目前性能有问题吗?如果是这样,瓶颈是否与控件的创建有关? LoginView 控件非常轻量级。隐藏/显示管理内容的逻辑必须存在于某个地方。声明式控件允许您以视觉方式表达自己,而不是在代码隐藏中。表达 100 次肯定有点冗长。您可以通过创建自定义服务器/用户控件包装器来跳过 loginview 控件,这些包装器除了您尝试隐藏/显示的验证器控件的基础属性之外还公开一个角色属性。
  • 我喜欢这种自定义控制方法。我将对此进行更深入的研究,看看它是否符合需要。
【解决方案3】:

通常可以通过将页面拆分为用户控件 (.ascx) 来解决此类问题。它可能会变得有点混乱,但可以完成工作。

虽然可能,但页面的继承很困难。您必须意识到,一个 .aspx 页面不能从另一个 .aspx 页面继承。这是因为 ASP.NET 编译器的工作方式:您的 .aspx XML 标记被编译成一个派生自您的代码隐藏类的类。由于这只发生在运行时,您不能从它继承另一个 .aspx 页面,因为在编译代码隐藏时该类根本不存在。

您可以做的是创建另一个继承自 Page 的类,并使您的 .aspx 代码隐藏类继承自该类。这是可能的,但请注意,此类没有 .aspx XML 部分 - 您必须自己实例化所有控件,并分配它们的属性。在大多数情况下,这会很混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多