ASP .NET表单和代码隐藏继承

时间:2011-01-05 10:13:43

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

首先,一些基本细节:

  • 我正在使用Visual Studio 2008 Team Edition
  • 我正在使用C#ASP .NET 2.0进行Web项目(而不是MVC)。

问题

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

我不想简单地创建此页面的副本,因为.aspx和aspx.cs文件中都会有很多重复的代码(我需要对其他几种形式执行相同的操作)。< / p>

我一直在使用C#.NET WinForms,但这是我第一个使用ASP .NET的真实项目,所以我还没有决定我最喜欢的方法来解决这个问题。

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

基本表单上的一些详细信息

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

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

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

我的想法

我在网上看到了一些不同的解决方案,在此基础上,我想出了一个大概我认为可能会有效的方法。

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

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

  • 创建添加和编辑用户页面,继承嵌套的母版页,同时继承嵌套母版页的类,以便获得对其所有控件的访问权限(我在某处读取了您无法继承的内容)其他页面......不确定主页是否相同?)

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

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

我已经开始尝试嵌套母版页,但是,由于这继承了MasterPage类,而不是Page类,因此我无法使用IsValid属性。我想知道如果我将嵌套的母版页继承到实际的 Page 并公开了验证控件,IsValid是否可以从每个页面正常工作?

我也不太清楚暴露每个控件,通常我会保持所有私有和设置访问器,但是考虑到这个窗体上的控件数量(以及其他我想使用这个模式),似乎就像那样会让事情变得一团糟。

编辑: 我继续使用嵌套母版页,并发现其所有控件都已设置为受保护,因此通过继承而不是System.Web.UI.Page,我可以访问所有控件。

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

不幸的是,由于页面现在继承了我的嵌套母版页的类,而不是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...
        }
    }

结束编辑

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

Read more on user controls in ASP.NET

- 帕维尔