zoukankan      html  css  js  c++  java
  • 网站项目开发经验总结

    开发工具: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<span><% if (1 == 2) Response.Write(""); else Response.Write("");%></span>

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

    前台代码:

    1<span><% =ShowSex(2%></span>

    后台代码:

    1protected String ShowSex(Int32 Sex)
    2{
    3    String Result = "";
    4    if (1 == Sex)
    5        Result = "";
    6    else
    7        Result = "";
    8    return Result;
    9}

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

     前台代码:

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

     后台代码:

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

    20}

    21

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

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

    加载用户控件:

    Control ctrlControl;
    ctrlControl 
    = Page.LoadControl("~/Control/Region.ascx");
    ctrlControl.ID 
    = "Region";
    testContainer.Controls.Add(ctrlControl);

    访问用户控件:

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

    4、访问Repeater及Datalist内的控件

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


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


    前台代码:

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

    外层Repeater数据绑定:

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

    21    }
     
    22
    23}


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

    1protected void Page_Load(object sender, EventArgs e)
    2{
    3    btnButton.Attributes.Add("OnClick""javascript:return confirm(\"确定?\");");
    4}
  • 相关阅读:
    centos 6.5 添加静态ip
    质数因子
    sizeof 和 strlen 的区别
    C++输入带空格的字符串
    字符集合
    汽水瓶
    算法汇总
    Word目录生成
    0-1背包问题的动态规划法与回溯法
    vue父元素调用子组件的方法报undefined
  • 原文地址:https://www.cnblogs.com/Randy0528/p/491159.html
Copyright © 2011-2022 走看看