Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET表单和代码隐藏继承_.net_Asp.net_Inheritance_Webforms_Code Behind - Fatal编程技术网

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

ASP.NET表单和代码隐藏继承,.net,asp.net,inheritance,webforms,code-behind,.net,Asp.net,Inheritance,Webforms,Code Behind,首先,一些基本细节: 我正在使用VisualStudio2008团队版 我将C#ASP.NET2.0用于一个Web项目(不是MVC) 问题 我有一个用户创建表单,但是我也需要一个表单来编辑用户详细信息,这在设计方面是相同的,除了它将预加载值并在表单按钮的单击事件中使用备用逻辑之外 我不想简单地创建此页面的副本,因为在.aspx和aspx.cs文件中都会有大量重复的代码(我需要对其他几个表单执行相同的操作) 我使用C#.NET WinForms已经有一段时间了,但这是我第一次真正使用ASP.N

首先,一些基本细节:

  • 我正在使用VisualStudio2008团队版
  • 我将C#ASP.NET2.0用于一个Web项目(不是MVC)
问题

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

我不想简单地创建此页面的副本,因为在.aspx和aspx.cs文件中都会有大量重复的代码(我需要对其他几个表单执行相同的操作)

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

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

基本表单的一些详细信息

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

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

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

我的想法

我在网上看到了一些不同的解决方案,基于这些,我对我认为可能会奏效的方法有了一个粗略的想法

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

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

  • 创建“添加”和“编辑”用户页,继承嵌套母版页,同时继承嵌套母版页的类,以获得对其所有控件的访问权(我在某个地方读到,您无法继承其他页…还不确定母版页是否也是如此?)

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

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

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

我也不太确定是否要公开每个控件,通常我会将所有内容都保持为私有,并设置访问器,但是考虑到此表单上的控件数量(以及我希望使用此模式的其他控件),这样看起来事情会很混乱

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

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

不幸的是,由于页面现在继承了嵌套母版页的类,而不是页面类,因此我无法访问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();
        }
    }
结束编辑

我还考虑为每个表单创建用户定义的控件,并在每个页面上使用它,必要时公开事件。然而,从我所读到的,这不允许设计与逻辑的适当分离,就像代码隐藏一样。尽管我承认,我自己还没有试过

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


非常感谢您的建议。谢谢

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

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


--Pavel

我刚刚在一个用户控件中实现了表单,它运行得非常好。除此之外,目前控件中仍然不存在IsValid。我会进一步调查。是的,与一些论坛帖子相反,Page.IsValid对我来说工作正常。必须将表单标记移到控件之外,但除此之外,它看起来运行良好。感谢您的快速解决方案!
    protected override void DoPostBack()
    {
        if (IsValid) //IsValid doesn't exist in this context.
        {
            //My logic here...
        }
    }