网站项目开发经验总结

开发工具:Visual Studio 2005.Net, SqlNetTool1.0
数据库:Sql Server 2000
语言:C#
框架:Asp.Net 2.0

一、牢骚篇 

        此次开发算得上我第一次真正意义上的dotNet团队项目开发,所以整个开发中我是以学习加专研的心态进行。在一个月的项目开发中,我负责数据库的Demo设计及程序编码实现;但整个项目开发出现了很多“无法预料的事”使得我心里老是感觉不踏实、心烦,以下主要是对我们项目开发中的现状提出一点疑问,也许讲出来可能心理会更好受一些。我谈谈自己的看法,如有不妥之处请指正:

1、 一味的缩短时间,催工、赶工能保质保量的完成项目么?整个项目实际开发只用了二十多天时间,而且频繁的加班(本身工作一天已经是很累的事情了,还要加班,这样的效率可想而知;而且还会影响第二天正常的工作)。短时间是做不出什么好东西的,做出来的也只是应付工作之用,以至于开发后期大量的程序修改(何苦又何必呢?)。
2、 初期需求分析没做好。单凭一个Demo版就能代表体现一切需求?有几个程序员知道理解?没有详细的文档说明,这是致命的伤害,在开发过程中要理解需求,自己为项目建立需求,每个人都跟据自己的想法思维来衡量设计功能(多么可笑的事情),对于这样的项目,以后的可展性更是无从谈起。这也直接影响到了第3点看法。
3、 无限的需求!需求几乎是每天在变,本身整个初期需求分析没做好,没有跟相关人员进行有效充分的沟通;再则就是相关领导自己没有明确的概念,今天看到某个东西好、有优点,就说这个功能要加到项目中,明天想到一点事情,也要加入项目中。最终导致数据库整体结构的大量改动,数据库的改动势必要程序员修改程序,从而影响整个项目的开发进度。
4、 团队建设。开发过程中招聘进来的同事如果他能力够强,首先他要熟悉一下我们的开发模式,了解需求才能进行开发。那如果能力欠佳呢?项目中遗留下来的程序就是可以说明一切。所以我想说的是新同事至少要能够理解整个开发项目的需求,以我们的开发模式写几个程序,然后对这些程序进行评价,该留的留该走的走,要不然拿项目当他们的试金石这种做法是不可取的。公司里没有经验丰富的程序员,宁愿多花几个银子找几个有.Net开发经验的开发人员,甚至可以是系统架构师,过多的考虑开发成本而没顾及项目质量,舍不得孩子套不住狼,难道没几个人能懂这个意思么?IT公司主要靠的是技术,如果没有雄厚的技术实力,试问又怎么与别人竞争抗衡?所以公司的技术人员的梯队建设非常重要,中间不应该有断层。
以上只是我个人的观点看法,所写的内容没有针对任何个人进行批判或者攻击,只是把项目开发过程中的感受和牢骚写出来罢了。

 

二、技术篇

       讲讲开发中碰到一些问题和解决办法,总结一下经验:
1、 可能很多人都会遇到这种情况:就拿性别来说好了,有时在数据库里存放的是1、0而不是男、女。此时在前台数据绑定的时候,我们总不可能性别用1、0来显示吧。
有两种方法可以实现:
第一种、在Sql查询时就把1、0替换成男女(此方法不在本文讨论范围之内),些方法归结为在数据层解决问题。
第二种、讲的是在业务层解的方法。通常有ASP开发习惯的程序员可能会想到

1 None.gif < span ><%   if  ( 1   ==   2 ) Response.Write( " " );  else  Response.Write( " " ); %></ span >

        但这种将逻辑写在页面上的方法,我个人不是很赞同。如果一个页面有多个地方显示性别呢?难道都这样东一个if西一个if?。
另一种方法是函数绑定,也是CodeBehind的精髓。

前台代码:

 

1 None.gif < span ><%   = ShowSex( 2 %></ span >

后台代码:

1 None.gif protected  String ShowSex(Int32 Sex)
2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
3InBlock.gif    String Result = "";
4InBlock.gif    if (1 == Sex)
5InBlock.gif        Result = "";
6InBlock.gif    else
7InBlock.gif        Result = "";
8InBlock.gif    return Result;
9ExpandedBlockEnd.gif}

 2、当Repeater里面有多个按钮,而且需要触发相应的事件时,怎么办呢?其实我们可以通过Repeater的OnItemCommand事件和Button按钮的CommandArgument参数和CommandName参数来实现。

 前台代码:

 1 None.gif < asp:Repeater  ID ="rptJobList"  runat ="server"  OnItemCommand ="rptJobList_ItemCommand" >
 2 None.gif     < HeaderTemplate >
 3 None.gif     < table >
 4 None.gif       < tr >
 5 None.gif         < td > 选择 </ td >< td > 职位名称 </ td >< td > 地点 </ td >< td > 招聘人数 </ td >< td > 发布日期 </ td >< td > 刷新日期 </ td >< td > 截止日期 </ td >< td > 操作 </ td >
 6 None.gif       </ tr >                     
 7 None.gif     </ HeaderTemplate >
 8 None.gif     < ItemTemplate >
 9 None.gif       < tr >
10 None.gif         < td >
11 None.gif             < asp:CheckBox  ID ="chkJobList"  runat ="server"   />
12 None.gif             < asp:HiddenField  ID ="hfJobList"  runat ="server"  Value ='<%#  Eval("JobID") % > ' />
13 None.gif         </ td >
14 ExpandedBlockStart.gifContractedBlock.gif         < td >< href ="Ep_EditPost.aspx?JobID=<%# Eval(" JobID") % > " target="_blank">  <% dot.gif Eval("JobName" %>   </ a ></ td >
15 ExpandedBlockStart.gifContractedBlock.gif         < td > <% dot.gif Eval("Region" %> </ td >
16 ExpandedBlockStart.gifContractedBlock.gif         < td > <% dot.gif Eval("Amount" %> </ td >
17 ExpandedBlockStart.gifContractedBlock.gif         < td > <% dot.gif # DataBinder.Eval(Container,"DataItem.Checkintime","{0:d}" %> </ td >
18 ExpandedBlockStart.gifContractedBlock.gif         < td > <% dot.gif # DataBinder.Eval(Container,"DataItem.RefreshTime","{0:d}" %> </ td >
19 ExpandedBlockStart.gifContractedBlock.gif         < td > <% dot.gif # DataBinder.Eval(Container,"DataItem.ValidDate","{0:d}" %> </ td >
20 None.gif         < td >
21 None.gif         < table >
22 None.gif           < tr >
23 None.gif             < td >
24 None.gif                 < asp:Button  ID ="btnRefreshJob"  runat ="server"  CommandName ="RefreshJob"  CommandArgument ='<%#  Eval("JobID") % > ' Text="刷新" />
25 None.gif             </ td >
26 None.gif             < td >
27 ExpandedBlockStart.gifContractedBlock.gif                 < asp:Button  ID ="btnStopJob"  runat ="server"  CommandName ="StopJob"  Visible ='<%#  EditStatus("StopJob",Byte.Parse(Eval("Status").ToString())) % > ' CommandArgument=' <% dot.gif Eval("JobID" %> ' Text="停止" />
28 ExpandedBlockStart.gifContractedBlock.gif                 < asp:Button  ID ="btnInitJob"  runat ="server"  CommandName ="InitJob"  Visible ='<%#  EditStatus("InitJob",Byte.Parse(Eval("Status").ToString())) % > ' CommandArgument=' <% dot.gif Eval("JobID" %> ' Text="恢复" />
29 None.gif             </ td >
30 None.gif             < td  class ="css" >
31 None.gif            
32 None.gif                 < asp:Button  ID ="btnDelJob"  runat ="server"  CommandName ="DelJob"  CommandArgument ='<%#  Eval("JobID") % > ' Text="删除" />
33 None.gif             </ td >
34 None.gif           </ tr >
35 None.gif         </ table >
36 None.gif         </ td >
37 None.gif         </ tr >
38 None.gif       </ ItemTemplate >
39 None.gif       < FooterTemplate >
40 None.gif         </ table >
41 None.gif       </ FooterTemplate >
42 None.gif </ asp:Repeater >
43 None.gif

 后台代码:

 1 None.gif protected   void  rptJobList_ItemCommand( object  source, RepeaterCommandEventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    Int64 lngJobID = Int64.Parse(e.CommandArgument.ToString()); //CommandArgument为Repeater内触发按钮的命令参数
 4InBlock.gif    switch (e.CommandName) 
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{//CommandArgument为Repeater内触发的按钮的命令名称
 6InBlock.gif        case "RefreshJob": //根据CommandName执行相应的操作
 7InBlock.gif            RefreshJob(lngJobID);
 8InBlock.gif            break;
 9InBlock.gif        case "DelJob":
10InBlock.gif            EditStatus(lngJobID, "DelJob");
11InBlock.gif            break;
12InBlock.gif        case "InitJob":
13InBlock.gif            EditStatus(lngJobID, "InitJob");
14InBlock.gif            break;
15InBlock.gif        case "StopJob":
16InBlock.gif            EditStatus(lngJobID, "StopJob");
17InBlock.gif            break;
18InBlock.gif
19ExpandedSubBlockEnd.gif    }

20ExpandedBlockEnd.gif}

21 None.gif

3、动态加载及访问用户控件,有时可能页面要根据程序动态载入控件。比如在testContainer中加入一个用户控件。

1 None.gif < div  id ="testContainer"  runat ="Server" >
2 None.gif
3 None.gif </ div >

加载用户控件:

None.gif Control ctrlControl;
None.gifctrlControl 
=  Page.LoadControl( " ~/Control/Region.ascx " );
None.gifctrlControl.ID 
=   " Region " ;
None.giftestContainer.Controls.Add(ctrlControl);

访问用户控件:

1 None.gif Region Region;
2 None.gifRegion  =  ((Region) this .FindControl( " Region " ));
3 None.gifRegion.RegionID  =   1576 ;

4、访问Repeater及Datalist内的控件

1 None.gif Button btnTemp  =   new  Button();
2 None.gif foreach  (RepeaterItem riTemp  in  rptTest.Items)  // rptTest为Repeater控件
3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
4InBlock.gif    btnTemp = ((Button)riTemp.FindControl("btnTest")); //btnTest为Repeater内的控件
5InBlock.gif    btnTemp.Text = "测试";
6ExpandedBlockEnd.gif}


5、两个Repeater嵌套显示。我们经常碰到要两Repeater嵌套显示的问题,比如论坛的大板块与分板块之间的嵌套显示如:


前台代码:

 1 None.gif < asp:Repeater  ID ="rptCategory"  runat ="server"  OnItemDataBound ="rptCategory_ItemDataBound" >
 2 None.gif < ItemTemplate >
 3 None.gif     < table >
 4 None.gif         < tr >
 5 ExpandedBlockStart.gifContractedBlock.gif             < td  > <% dot.gif # DataBinder.Eval(Container,"DataItem.name" %> </ td >
 6 None.gif         </ tr >
 7 None.gif     </ table >
 8 None.gif     < asp:Repeater  ID ="rptForum"  runat ="server" >
 9 None.gif         < HeaderTemplate >
10 None.gif             < table >
11 None.gif                 < tr >
12 None.gif                     < td > Forums </ td >
13 None.gif                 </ tr >
14 None.gif         </ HeaderTemplate >
15 None.gif         < ItemTemplate >
16 None.gif             < tr >
17 None.gif                 < td >
18 ExpandedBlockStart.gifContractedBlock.gif                     <% dot.gif # DataBinder.Eval(Container,"DataItem.name" %>
19 None.gif                 </ td >
20 None.gif             </ tr >
21 None.gif         </ ItemTemplate >
22 None.gif         < FooterTemplate >
23 None.gif             </ table >
24 None.gif             < br  />
25 None.gif         </ FooterTemplate >
26 None.gif     </ asp:Repeater >
27 None.gif </ ItemTemplate >
28 None.gif </ asp:Repeater >
29 None.gif

外层Repeater数据绑定:

None.gif CjiveCategory xjiveCategory =   new  CjiveCategory();
None.gifDataSet xDataSet 
= new  DataSet();
None.gifxDataSet 
=  xjiveCategory.GetDataSetByStatus();
None.gif
if (xDataSet != null )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    rptCategory.DataSource 
= xDataSet;
InBlock.gif    rptCategory.DataBind();
ExpandedBlockEnd.gif}

 

外层Repeater的ItemDataBound事件及内层Repeater数据绑定
 1 None.gif protected   void  rptCategory_ItemDataBound( object  source, RepeaterItemEventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif
 5InBlock.gif        Repeater rptForum = (Repeater) e.Item.FindControl("rptForum"); 
 6InBlock.gif
 7InBlock.gif        DataRowView rowv = (DataRowView)e.Item.DataItem; 
 8InBlock.gif        //提取ID 
 9InBlock.gif        int categoryID = Convert.ToInt32(rowv["categoryID"]); 
10InBlock.gif        //根据分类ID查询该分类下的版块,并绑定子Repeater
11InBlock.gif        CviewForumMessage xviewForumMessage= new CviewForumMessage();
12InBlock.gif        CviewForumMessageCollection xList;
13InBlock.gif        xviewForumMessage.categoryID = categoryID;
14InBlock.gif        xList=xviewForumMessage.List();
15InBlock.gif        if(xList != null)
16ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
17InBlock.gif            rptForum.DataSource = xList; 
18InBlock.gif            rptForum.DataBind(); 
19InBlock.gif        
20ExpandedSubBlockEnd.gif        }

21ExpandedSubBlockEnd.gif    }
 
22InBlock.gif
23ExpandedBlockEnd.gif}


6、 为服务端控件添加Javascript事件

1 None.gif protected   void  Page_Load( object  sender, EventArgs e)
2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
3InBlock.gif    btnButton.Attributes.Add("OnClick""javascript:return confirm(\"确定?\");");
4ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/Randy0528/archive/2006/08/31/491159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值