为什么只有一个裤衩的问问题呢,搞得偶想问问题都不好意思了:如何才能在表现层少一些冗余代码?如何写通用的Page类?

bwangel 2007-12-02 05:22:54
大家看我下面这个简单的后台的aspx.cs代码,先不管他什么功能,可是我这样的页面有十多个,都是大体相同的,不同的我在注释里写了。
这只是个简单的例子,另外有很多其他的复杂页面用到了很多控件,可是后台代码也都是大同小异。
using ...
using ComLib;

namespace FWeb.FReceive
{
public partial class PreReceiveRpt : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
if (!export(CommOp.ToStr(Request.QueryString["CaseNo"])))
txtCaseNo.Focus();
}

protected bool export(String caseNo)
{
if (caseNo == String.Empty) return false;

ExportPreReceive er = new ExportPreReceive(caseNo);//只有这个地方不同,new 了不同类型的对象
er.ExportToExcel();
return true;
}

protected void btnUpdate_Click(object sender, EventArgs e)
{
if (!export(MyWeb.GetUpperText(txtCaseNo)))
txtCaseNo.Focus();
}
}
}
...全文
242 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingfz 2007-12-03
  • 打赏
  • 举报
回复
呵呵,感觉 逻辑 和 表现 混在一起了。
会不会是设计的问题,设计得好的话,应该不会出现这种情况。表现 就做表现的事,逻辑里才决定初始化哪个对象。

说错了莫怪啊。 也是刚学asp.net 不久
bwangel 2007-12-03
  • 打赏
  • 举报
回复
谢谢个位,不过我最后还是用了泛型+接口,在业务类里动了手术,所有的带参构造函数都改写成了无参构造函数:

以下是模版页:

using ...
using ComLib;

/// <summary>
/// ExportPage 的摘要说明
/// </summary>
public class ExportPage<T>:Page where T:new()
{
protected TextBox txtCaseNo;

protected override void OnLoad(EventArgs e)
{
txtCaseNo = (TextBox)this.MasterP.FindControl("CPH").FindControl("txtCaseNo");
if (!export(CommOp.ToStr(Request.QueryString["CaseNo"])))
txtCaseNo.Focus();
}

protected bool export(String caseNo)
{
if (caseNo == String.Empty) return false;

IExport er = (IExport)new T();
er.CaseNo = caseNo;
er.ExportToExcel();
return true;
}

protected void btnUpdate_Click(object sender, EventArgs e)
{
if (!export(MyWeb.GetUpperText(txtCaseNo)))
txtCaseNo.Focus();
}
}



这样,我的正式页面只需要一行就解决了问题,这样的页面有十多个!

using ....
using ComLib;

namespace FWeb.FReceive
{
public partial class PreReceiveRpt : ExportPage<ExportPreReceive> { }
}


真想给自己加分,呵呵。
ltmltm123456 2007-12-03
  • 打赏
  • 举报
回复
单从设计角度考虑的哈 其它的我也不懂
ltmltm123456 2007-12-03
  • 打赏
  • 举报
回复
不知道我说的对不对 

封装变化
  把类似于ExportPreReceive的类 抽象或接口出来..  
....
using ComLib;

namespace FWeb.FReceive
{
public partial class PreReceiveRpt : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
if(!export(CommOp.ToStr(Request.QueryString["CaseNo"]),具体类ExportPreReceive))
txtCaseNo.Focus();
}

protected bool export(String caseNo,抽象类ExportPreReceive aaa)
{
if (caseNo == String.Empty) return false;

抽象类ExportPreReceive 抽象类er = new aaa(caseNo);//只有这个地方不同,new 了不同类型的对象
抽象类er.ExportToExcel();
return true;
}
           .....
}
}
bwangel 2007-12-03
  • 打赏
  • 举报
回复
这么说吧,我的很多页面都很相似,一些局部该用用户控件的都用用控件包装了,主页里代码很少,就比如说我的这个页面,但是尽管如此还是有很多貌似相同的处理,如何才能进一步抽象?
bwangel 2007-12-02
  • 打赏
  • 举报
回复
我的Email是bwangel@163.com
bwangel 2007-12-02
  • 打赏
  • 举报
回复
首先多谢楼上。确实有很多地方没搞懂。
IExportToExcel接口当然是可以实现的,只不过你说的模板页也提供一个接口,
纯接口是没有实现只有方法签名的,不知export在模板页里实现是否合法?
即使合法,到头来我不是还得把其他的方法诸如btnUpdate_Click之类的在具体页面里面实现吗?
曲滨_銘龘鶽 2007-12-02
  • 打赏
  • 举报
回复
假设 ExportPreReceive 实现了 IExportToExcel
可以做模板页,然后使用模板页的 Page 实现一个接口函数如 IExportToExcel IPage01.GetToExcelClass(string) or IPage01.GetToExcelClass(object);

在模板页里

protected bool export(String caseNo)
{
if (caseNo == String.Empty) return false;

IExportToExcel toExcel = ((IPage01)this.Page).GetToExcelClass(caseNo);

toExcel.ExportToExcel()
return true;
}



看不懂发邮件 flashelf@163.com

62,075

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧