首先,一些基本细节:
问题
我有一个用户创建表单,但我还需要一个表单来编辑用户详细信息,这在设计方面是相同的,除了它会预先加载值并在点击事件中使用备用逻辑表格的按钮。
我不想简单地创建此页面的副本,因为.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...
}
}
结束编辑
我还考虑为每个表单创建用户定义的控件,并在每个页面上使用它,根据需要公开事件。但是,从我读过的内容来看,这不允许将设计与逻辑正确分离,就像代码隐藏一样。虽然我承认,我还没有尝试过。
我不想深入研究我目前的设计选择,因为我可能还没有想到更好的解决方案。
任何建议都非常感谢。谢谢!
答案 0 :(得分:1)
我认为最简单的解决方案是创建一个用户控件(.ascx
文件)来封装逻辑。控件可以公开您可以订阅的某些事件(例如,Submit
)以执行自定义逻辑。
您可能仍会有两个不同的页面,但在上述情况下,您不需要复制粘贴几乎相同的代码。
Read more on user controls in ASP.NET
- 帕维尔