none
团队开发一个ASP.NET网站需要注意哪些规范和细节? RRS feed

  • 常规讨论

  •      本人还在学习编程中,最近想做一个大点的ASP.NET网站学习下。于是拉了一个团队,来做这个网站(20几人)。做一个项目,这么多人,我想必须得要个规范,一是为了便于合作,以及以后的维护;二是从网站性能方面考虑。我想了很久,也在网上搜了些,但觉得都不够。希望各位有经验的热心人提些建议,帮帮我们小辈。呵呵。
         细节决定成败,希望您能够给出详细的信息,因为我们都没有工作经验,有的只是满腔热情和兴趣。如果愿意提供详细文档,请发邮箱qingxintan@vip.qq.com,如果需要交流,请加QQ 512982554。在此谢谢大家了,热切希望得到你们的帮助。
    • 已编辑 清心 2009年9月16日 15:34
    2009年9月15日 6:53

全部回复

  •     拜托各位帮帮忙哈。
    2009年9月16日 0:12
  • 我把我写出的一些规范发出来,大家提提建议好吗?

    1.1  目录结构规范

    q  目录建立的原则:以最少的层次提供最清晰简便的访问结构。

    q  目录的命名以小写英文字母,下划线组成。(参照命名规范)

    q  根目录一般只存放Default.aspx或者Index.html以及其他必须的系统文件。

    q  每个主要栏目开设一个相应的独立目录。

    q  根目录下的images用于存放各页面都要使用的公用图片,子目录下的images目录存放本栏目页面使用的私有图片。

    q  所有JS脚本存放在根目录下的scripts目录。

    q  所有CSS文件存放在根目录下style目录。

    q  所有flash, avi, ram, quicktime等多媒体文件存放在根目录下的media目录。

    1.2  文件命名规范

    q  文件命名的原则:以最少的字母达到最容易理解的意义。

    q  一般文件及目录命名规范:每一个目录中应该包含一个缺省的html 文件,文件名统一用index.htm

    q  文件名称统一用小写的英文字母、数字和下划线的组合,尽量按单词的英语翻译为名称。例如:feedback(信息反馈)aboutus(关于我们),多个同类型文件使用英文字母加数字命名,字母和数字之间用_分隔。例如:news_01.htm。注意,数字位数与文件个数成正比,不够的用0补齐。例如共有200条新闻,其中第18条命名为news_018.htm

    q  图片的命名规范 :名称分为头尾两两部分,用下划线隔开。头部分表示此图片的大类性质。例如: 放置在页面顶部的广告、装饰图案等长方形的图片我们取名:banner ;标志性的图片我们取名为:logo;在页面上位置不固定并且带有链接的小图片我们取名为button;在页面上某一个位置连续出现,性质相同的链接栏目的图片我们取名:menu;装饰用的照片我们取名:pic;不带链接表示标题的图片我们取名:title 依照此原则类推。尾部分用来表示图片的具体含义,用英文字母表示。例如:banner_sohu.gif banner_sina.gif menu_aboutus.gif menu_job.gif title_news.gif logo_police.gif logo_national.gif pic_people.jpg pic_hill.jpg.。有onmouse效果的图片,两张分别在原有文件名后加"_on""_off"命名。

    q  其它文件命名规范:js的命名原则以功能的英语单词为名。例如:广告条的js文件名为:ad.js

    1.3  首页代码规范

    q  首页的代码关键在head区,head区是指首页HTML代码的<head></head>之间的内容。head区必须加入的标识。比如,网页显示字符集——简体中文:<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">;原始制作者信息 <META name="author" content="webmaster@yoursite.com"> ;网站简介 <META NAME="DESCRIPTION" CONTENT="这里填您网站的简介"> ;搜索关键字 <META NAME="keywords" CONTENT="关键字1,关键字2,关键字3,..."> ;网页的css规范 <LINK href="style/style.css" rel="stylesheet" type="text/css"> ;网页标题 <title>网页标题</title>;如果使用的是母版页也应该设置Title属性。

    q  设定网页的到期时间。一旦网页过期,必须到服务器上重新调阅。<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">

    q  禁止浏览器从本地机的缓存中调阅页面内容。<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

    q  用来防止别人在框架里调用你的页面。<META HTTP-EQUIV="Window-target" CONTENT="_top">

    q  自动跳转。<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://www.yahoo.com">5指时间停留5秒。

    q  网页搜索机器人向导。用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。<META NAME="robots" CONTENT="none">    CONTENT的参数有all,none,index,noindex,follow,nofollow。默认是all

    q  收藏夹图标。<link rel = "Shortcut Icon" href="favicon.ico">

    q  JS调用规范。所有的javascript脚本尽量采取外部调用。    <SCRIPT LANGUAGE="JavaScript" SRC="script/xxxxx.js"></SCRIPT>

    q  CSS书写规范。所有的CSS的尽量采用外部调用。    <LINK href="style/style.css" rel="stylesheet" type="text/css">

    q  书写时重定义的最先,伪类其次,自定义最后(其中a:link a:visited a:hover a:actived 要按照顺序写)便于自己和他人阅读。

    q  为了保证不同浏览器上字号保持一致,字号建议用点数pt和像素px来定义,pt一般使用中文宋体的9pt11ptpx一般使用中文宋体12px 14.7px 这是经过优化的字号,黑体字或者宋体字加粗时,一般选用11pt14.7px 的字号比较合适。

    q  推荐使用主题。

    q  CSS推荐模板。

    <style type="text/css">

    <!—

    p { text-indent: 2em; }

    body { font-family: "宋体"; font-size: 9pt; color: #000000; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px}

    table { font-family: "宋体"; font-size: 9pt; line-height: 20px; color: #000000}

    a:link { font-size: 9pt; color: #0000FF; text-decoration: none}

    a:visited { font-size: 9pt; color: #990099; text-decoration: none}

    a:hover { font-size: 9pt; color: #FF9900; text-decoration: none}

    a:active { font-size: 9pt; color: #FF9900; text-decoration: none}

    a.1:link { font-size: 9pt; color: #3366cc; text-decoration: none}

    a.1:visited { font-size: 9pt; color: #3366cc; text-decoration: none}

    a.1:hover { font-size: 9pt; color: #FF9900; text-decoration: none}

    a.1:active { font-size: 9pt; color: #FF9900; text-decoration: none}

    .blue { font-family: "宋体"; font-size: 10.5pt; line-height: 20px; color: #0099FF; letter-spacing: 5em}

    -->

    </style>

    q  body标识。为了保证浏览器的兼容性,必须设置页面背景<body bgcolor="#FFFFFF">

    1.4  尺寸规范

    q  屏幕设置为800*600/1024*768

    q  页面长度原则上不超过3屏,宽度不超过1屏。

    q  全尺寸banner(横幅)为468*60px,半尺寸banner234*60px,小banner88*31px,另外120*90120*60也是小图标的标准尺寸。

    q  每个非首页静态页面含图片字节不超过60K,全尺寸banner(横幅)不超过14K

    q  为了优化性能,尽量使用Css来美化页面。页面上尽量不使用图片,尤其是大图,需要使用图片,尽量将大图切成小图。

    1.5  导航规范

    q  导航要简单、清晰,建议不超过3层的链接。

    q  用于导航的文字要简明扼要,字数限制在一行以内。

    q  首页,各栏目一级页面之间互链,各栏目一级和本栏目二级页面之间互链。

    q  超过三级页面,在页面顶部设置导航条,标明位置。

    q  突出最近更新的信息,可以加上更新时间或New标识。

    q  连续性页面应加入上一页,下一页按钮。

    q  超过一屏的内容,在底部应有go top按钮。

    q  超过三屏的内容,应在头部设提纲,直接链接到文内锚点。

    2009年9月16日 3:13
  • 1.6  编程规范

    1.6.1  控件规范

    q  控件使用原则:尽可能使用Html控件,需要提交而又不用在客户端使用Javasrcipt的可以使用Web控件。

    q  页面上所有显示的文字都必须使用Label控件。

    q  对于许多值,都要思考,是否需要对其进行非空判断,如果为空给其赋一个怎样的值(建议使用三元运算符)。

    q  命名规范:除了某些无意义的Label控件无需命名外(关键的仍需要注意),其他的控件需按照前缀+用途功能,如btn+按钮操作功能(如btnSave)。前缀见下表。

    1.1  控件前缀

    控件

    前缀

    控件

    前缀

    Form

    frm

    Class

    cls/C

    Module

    mod

    Label

    lbl

    LinkLabel

    lnk

    Button

    btn

    TextBox

    txt

    CheckBox

    chk

    RadioButton

    rad

    GroupBox

    grp

    PictureBox

    pic

    DataGrid

    grd

    ListBox

    lst

    CheckedListBox

    clst

    ComboBox

    cbo

    TreeView

    tvw

    ListView

    lvw

    TabControl

    tab

    DateTimePicker

    dtp

    Timer

    tmr

    Splitter

    spl

    ProgressBar

    pbar

    RichTextBox

    rtf

    ImageList

    imgl

    ToolBar

    tlb

    MenuItem

    mnu

    q  不使用Ajax控件及其扩展控件,需要实现局部刷新则使用pro框架。

    q  下拉列表绑定后,注意给第一项添加提示。如果是更新页面,需要指定原来的选择,即给SelectedValue赋值就行了。添加第一项提示的代码如下:

                ddlrole.Items.Insert(0, new ListItem("请选择角色", "请选择角色"));

    q  不使用除Repeater之外的数据控件,格式可以遵照下面的模板。

    1.1  使用Repeater控件布局

    相关源码

    1.6.2  代码规范

    q  为了美化页面效果,实现某些功能,可以多写Javascript,不要求写复杂,力求简单实用。同样的,Css也是如此。如下面这个Js,是实现全选、多选删除的。

    <script type="text/javascript">

    function sel_cli()

    {

        var strSel='';

        var formObj=document.getElementById('<%= Form.ClientID %>');

        for(var i=0;i<formObj.elements.length;i++)

        {

            var e=formObj.elements[i];

            if(e.type.toUpperCase()=='CHECKBOX')

            {

                if(e.checked)

                {

                    strSel += ',' + e.value;

                }

            }

        }

        var lab = document.getElementById('<%=HiddenField1.ClientID %>');

        lab.value = strSel;

    }

    function checkAll(obj)

    {

             var el = document.getElementsByName('chkDelete');

             var len = el.length;

             for(var i=0; i<len; i++){

                 el[i].checked =obj.checked;

             }

             sel_cli();

    }

    </script>

    这里,将选中的复选框的值保存在HiddenField中了,因此,可以实现多选删除。

    q  在删除记录等操作时,需要给出提示。

    q  拼接字符串时,尽量使用StringBuilding,因为性能更好。

    q  变量及常量命名规范:(1Pascal——大小写形式-所有单词第一个字母大写,其他字母小写。(2Camel——大小写形式-除了第一个单词,所有单词第一个字母大写,其他字母小写。类名使用Pascal 大小写形式。

    public class HelloWorld{ ...}

    方法使用Pascal 大小写形式。

    public class HelloWorld{ void SayHello(string name) { ... }}

    变量和方法参数使用Camel大小写形式

    public class HelloWorld

    {

            int totalCount = 0;

             void SayHello(string name)

             {

            string fullMessage = "Hello " + name;

            }

    }

    q  用有意义的,描述性的词语来命名变量。

    q  文件名要和类名匹配。

    q  不滥用扩展方法。

    q  注意代码格式,如果格式乱了,使用Ctrl+K+D快捷键来使代码格式化。

    q  避免写太长的方法。一个典型的方法代码在125行之间。如果一个方法发代码超过25行,应该考虑将其分解为不同的方法。方法名需能看出它作什么。别使用会引起误解的名字。如果名字一目了然,就无需用文档来解释方法的功能了。

    q  错误消息需能帮助用户解决问题。永远别用象"应用程序出错", "发现一个错误" 等错误消息。而应给出象 "更新数据库失败。请确保登陆id和密码正确。"的具体消息。显示错误消息时,除了说哪里错了,还应提示用户如何解决问题。不要用象"更新数据库失败。"这样的,要提示用户怎么做:"更新数据库失败。请确保登陆id和密码正确。"显示给用户的消息要简短而友好。但要把所有可能的信息都记录下来,以助诊断问题。

    q  在需要的地方注释。可读性强的代码需要很少的注释。如果所有的变量和方法的命名都很有意义,会使代码可读性很强并无需太多注释。

    q  异常处理:要注意在程序中进行异常处理,发生异常时,给出友好的消息给用户,但要精确记录错误的所有可能细节。不必每个方法都用try-catch。当特定的异常可能发生时才使用。别写太大的try-catch 模块。如果需要,为每个执行的任务编写单独的try-catch 模块。这将有助于找出哪一段代码产生异常,并给用户发出特定的错误消息。如果应用程序需要,可以编写自己的异常类。自定义异常不应从基类SystemException派生,而要继承于IApplicationException

    q  所有的方法体、构造函数、接口等等开头都要加上注释,所以注释使用.NET注释规范,即文档注释。所有的常量变量,无论是全局还是局部使用的,凡是对代码整体起到关键性做用的都需要加上注释。

    q  使用验证控件时,记得在代码中添加Page.IsValid判断。

    q  所有文本框记得去空格(Trim())

    q  某些脚本可以如此添加:   

    //为说明信息框添加脚本

    txtrmk.Attributes.Add("onfocus", "if(this.value=='输入说明信息...') this.value=''");

    txtrmk.Attributes.Add("onblur", "if(this.value=='') this.value='输入说明信息...'");

    q  弹出消息框建议写成一个方法,如:

        /// <summary>

        /// 弹出消息

        /// </summary>

        /// <param name="text">消息文本</param>

        public void AlertScript(string text)

        {

            string str = "<script language='JavaScript'>";

            str = str + ("alert('" + text + "');");

            str = str + ("</script>");

            Page.RegisterStartupScript("ok", str);

        }

    q  不随便修改他人代码,即使必须修改(修改之前注意通知原作者),需要在修改处的开始及结尾,加上自己的注释信息,格式如下:

    //BEGIN 2009-9-13 李文强  修正了XXX问题

    略…

    //END  2009-9-13 李文强

    2009年9月16日 3:19
  • 1.6.2  数据库规范

    q  在执行更新、插入时,需要对传入的值进行处理,比如英文单引号“”,要替换成“’’”。在本项目中,可能会定义一个全局的扩展方法进行上述处理。

    q  在设计数据表时,需在填写该字段的备注信息(属性里边)。

    q  所有的数据表之间不建立任何主外键关系,其关系在编程中控制(需要注意相关字段的命名)。

    q  多表查询使用视图,并且不使用连接查询。

    q  所有的T-Sql语句尽量写成存储过程。

    q  在所有的更新插入语句中,需要对html标记进行处理。

    q  SQL注入攻击让恶意用户改变SQL命令或者执行任意的SQL命令。典型的SQL 注入攻击是取代或添加到那些已经作为应用程序一部分合理执行的查询。当你使用字符串连接去创建带有从终端用户输入值的SQL语句时,发动SQL注入攻击将变的可行。例如,下面SQL语句可能被用于修改用户的密码:

    sql = "select * from UserInfo where password='" + password + "'";  

    恶意用户可以利用下面的输入绕过密码检查:password = "' or 1=1 --"; 更糟糕的是恶意用户可能利用命令分隔符(;)去添加SQL命令到用户输入,如下面的例子: ; DROP TABLE。为帮助避免SQL注入, SQL查询中使用命令参数可帮助验证用户的输入。单引号将代表候补格式通过验证。这个例子将不会引起SQL注入尽管密码并非有效:

    cmd = new SqlCommand("select * from UserInfo where password=@ password", conn);SqlParameter pwd =

    cmd.Parameters.Add("@password", SqlDbType.Char, 20);pwd.Direction = ParameterDirection.Input;pwd.Value = "' or 1=1

    --";

    1.7  其他

    q  在某些页面某些部分可以考虑使用缓存。

    q  储存值可以使用HiddenFieldViewStateSessionApplicationCookieCache以及在配置文件中读写。要注意其性能,该用哪个就用哪个。

    q  如果某页面内容固定,请使用静态页(html)。

    q  在需要的时候,可以考虑使用iframe。如:

                    <iframe width="100%" height="600" frameborder="0" scrolling="auto" src="<%

     

    =CommonData.applicationPath %>/admin/DaiLian/PriceAndDate.aspx">

                    </iframe>

    q  在很多时候,都要注意有【返回】按钮。可以考虑使用jsjavascript:history.go(-1);

    q  为用户提供网站地图,列出指向网站重要部分的链接。

    q  如果在制作过程中出现任何问题,请说出来,或者与他人讨论。

    q  如果你有什么好的想法,也请提出来。

    2009年9月16日 3:19
  • 无语........说句走过路过,我心里也舒服点。呵呵。....
    2009年9月20日 1:18
  • 团队开发,源代码管理器得会用。
    规范统一很有必要。
    再就是交流合作了。
    2009年10月18日 11:00
  • 搭建个SVN进行版本控制和源代码管理吧


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    2009年10月18日 12:10
    版主
  • 楼主很强!

    2011年5月30日 7:57