【问题标题】:ASP .NET Form and codebehind InheritanceASP .NET 表单和代码隐藏继承
【发布时间】:2011-01-05 10:13:42
【问题描述】:

首先,一些基本细节:

  • 我使用的是 Visual Studio 2008 Team Edition
  • 我将 C# ASP .NET 2.0 用于 Web 项目(不是 MVC)。

问题

我有一个用户创建表单,但是我还需要一个表单来编辑用户详细信息,这在设计方面是相同的,除了它将预加载值并在点击事件中使用替代逻辑这一事实表单的按钮。

我不想简单地创建此页面的副本,因为 .aspx 和 aspx.cs 文件中会有很多重复的代码(我需要为其他几个表单做同样的事情)。

我使用 C# .NET WinForms 已经有一段时间了,但这是我第一个使用 ASP .NET 的真正项目,所以我还没有决定我最喜欢的解决这个特殊问题的方法。

我正在寻找被认为是在这种情况下继承表单的最佳方法。

基本表单的一些细节

它目前继承了一个母版页,其中包含整个网站使用的布局。

它具有所有必需的输入,每个输入都带有验证控件,以及用于检查用户名可用性的 AJAX 更新面板。我当然使用 AJAX 回发的代码隐藏文件,以及服务器端验证(以防客户端未启用 java 脚本)。

当然,一旦输入被验证,按钮点击事件包含所有逻辑。

我的想法

我在网上看到了一些不同的解决方案,并在此基础上对我认为可行的方案提出了一个粗略的想法。

  • 使用嵌套母版页以继承站点的全局布局,并包含基本表单。

  • 将嵌套母版页上的控件设置为受保护,而不是私有。

  • 创建添加和编辑用户页面,继承嵌套母版页,还继承嵌套母版页的类,以便访问其所有控件(我在某个地方读到,你不能继承其他页面...不确定母版页是否也是如此?)

  • 然后我需要覆盖 DoUserSubmit_Click(我的表单按钮)事件,以在每个页面上使用创建或编辑逻辑。

  • 还需要使用编辑页面上的 Page_Load 事件来填充所有嵌套母版页输入的值。

我已经开始尝试嵌套母版页,但是,因为它继承了 MasterPage 类,而不是 Page 类,所以 IsValid 属性对我不可用。我想知道如果我将嵌套母版页继承到一个实际的 Page 并暴露了验证控件,IsValid 是否可以在每个页面上正常工作?

我也不太确定是否公开每个控件,通常我会将所有内容保密并设置访问器,但是鉴于此表单上的控件数量(以及我想要使用此模式的其他控件),它似乎那样事情就会变得一团糟。

编辑:我在嵌套母版页上更进一步,发现它的所有控件都已设置为受保护,因此通过继承它而不是System.Web.UI.Page,我可以访问所有的控件。

我无法覆盖点击事件,但我确实使用了一种替代解决方案,该解决方案允许我执行一些健全性检查,因此效果很好。

不幸的是,由于该页面现在继承了我的嵌套母版页的类,而不是 Page 类,所以我无法访问 Page.IsValid,这在客户端验证不起作用或无效的情况下非常重要已禁用。

目前的解决方案如下:

在嵌套母版页中:

    /// <summary>
    /// This method is what contains the logic to perform once the form has been submitted.
    /// </summary>
    protected abstract void DoPostBack();

    protected void DoRegister_Click(object sender, EventArgs e)
    {
        if (IsPostBack) //Would prefer to do IsValid check here.
        {
            DoPostBack();
        }
    }

在添加/编辑页面中:

    protected override void DoPostBack()
    {
        if (IsValid) //IsValid doesn't exist in this context.
        {
            //My logic here...
        }
    }

结束编辑

我还考虑过为每个表单创建用户定义的控件,并在每个页面上使用它,并在必要时公开事件。但是,根据我的阅读,这不允许将设计与逻辑正确分离,就像代码隐藏一样。虽然我承认,但我自己还没有尝试过。

我不想深入研究我当前的设计选择,因为我可能还没有想到更好的解决方案。

非常感谢任何建议。谢谢!

【问题讨论】:

    标签: .net asp.net inheritance webforms code-behind


    【解决方案1】:

    我认为最简单的解决方案是创建一个用户控件(.ascx 文件)来封装逻辑。该控件可以公开一些您可以订阅的事件(例如,Submit),以便执行您的自定义逻辑。

    您可能仍然有两个不同的页面,但在上述情况下,您不需要复制粘贴几乎相同的代码。

    Read more on user controls in ASP.NET

    -- 帕维尔

    【讨论】:

    • 我刚刚在用户控件中实现了表单,一切都很好。除了,此时 IsValid 仍然不存在于控件中。我会进一步调查。
    • 是的,与一些论坛帖子相反,Page.IsValid 对我来说工作正常。不得不将表单标签移到控件之外,但除此之外,它看起来都运行良好。感谢您的快速解决!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2012-11-22
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多