勇敢者的游戏

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuruhong/article/details/1328272
 勇敢者的游戏——利用ASP.NET建立你的商业应用作者:刘如鸿原文发表于《程序员》杂志2006年第10期 楔子严格地说,这不是一篇Web开发的最佳实践,至少不是纯粹的ASP.NET开发实践,就如标题所言,采用ASP.NET去构建商业应用是需要一些勇气的,你需要有一些勇气去说服别人,需要有一些勇气去判断你自己的技术决策。在这里我们不是去讨论所谓微软的霸权主义,所谓W
展开阅读全文

◆-◆勇敢者论坛源代码分析系列(1)—数据查询

12-18

通过前几天对大家征求意见,反应比较好,在此感谢大家!rnhttp://topic.csdn.net/u/20081215/09/641e87a0-bd7f-469b-9904-b5cb39e8784a.html?184563615rn今天发布代码分析第一章,水平,文采有限,大家多指点!rnrn 前言:勇敢者论坛是一个开放源码的ASP.NET c#论坛,使用VS.NET 2005开发管理,可以支持两种数据库 SQL2000或Accsee。作者的开发本意,就是提供给大家学习使用的。写本系列代码分析,也是为了初学者更快的入门和进步。祝大家学习愉快!多多指教。 rn 勇敢者论坛: [url=http://bbs.doughty.cn/default2.aspx]程序演示[/url] [url=http://bbs.doughty.cn/down.aspx]源码下载[/url]rnrn 记得当时初学编程的时候,如果实现了一个小的功能,即使是拿别人的代码拼凑出来的,心里那个乐啊,都别提多高兴了。很怀念当时的感觉。rnrn 记住:每天积累,总有一天,你会成为高手。rnrn 本文章系列尽量保持实用的原则,使初学者能够逐步掌握一些小技巧,利用一些浅显易懂的例子,引导大家掌握一些学习和开发的方法,方法掌握了,以后进步就会很顺利了。rnrn 对于静态网页的制作,只要掌握一些静态标签,样式规定等就可以了,另外有很多设计工具,比如dreamwaver等,使得设计人员能够更加轻松的进行设计,由于这些软件的智能性,你甚至可以不是很精通那些标签,就能设计出自己的homepage。在确认你能够比较熟练的掌握静态网页制作的基础上,就可以慢慢进入动态网站的设计了。rnrn 其实制作动态网站,也不需要想象的多难,多复杂,把需要的最基本的技术分解一下,可以这样认为:动态网站,就是以数据库为基础,能够跟用户实现一些互动功能,如用户注册、用户登录、用户管理、发帖跟贴、浏览帖子、修改帖子等等的网站。核心在于网站程序对数据库的操作,而对操作数据库来讲,只要你掌握了select, insert, update, delete四大操作方法,就算对数据库操作掌握了大半,基本的动态网站,应该都能做出来了。想想是不是这样:用户注册(insert)、用户登录(select)、用户管理(update)、发帖跟贴(insert)、用户登录(select) 、浏览帖子(select) 、修改帖子(update)。rnrn 今天我们就学习select,以[url=http://bbs.doughty.cn/default2.aspx]勇敢者论坛(开放源码的ASP.NET论坛)[/url] 的 Main.aspx 这个页面为例子,看看是怎么把帖子列表显示出来的。 打开代码,我们可以看到 ,这是调用了一个用户控件,从最上边几行,我们可以找到 <%@ Register TagPrefix="uc1" TagName="MainDL" Src="MainDL.ascx" %>,说明这个调用的是 MainDL.ascx,那么我们就看看 MainDL.ascx吧。 从MainDL.ascx中找到。rnrn DataList Web 服务器控件以某种格式显示数据,这种格式可以使用模板和样式进行定义。DataList 控件可用于任何重复结构中的数据,如表。DataList 控件可以以不同的布局显示行,如按列或行对数据进行排序。rnrn 查看代码,看看如何绑定数据的,首先是绑定时机,当然是在 Page_Load 的时候最好了:rnrnprotected void Page_Load(object sender, System.EventArgs e)rnrn // 从web.config中读取显示条数。rn int PageSize=System.Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["MainList"]);rnrn //查询数据 rn this.DataList1.DataSource=DBOperate.SelectFormForum("SELECT A.Q_ID,A.solved, A.author, A.ImageName, A.HiteCounter, A.AnsCounter, A.ReleaseTime, A.ReferTime, A.BigClass_ID, A.SmallClass_ID, A.kind, A.ReleaseTime, A.ReferTime, A.BigClass_ID, A.SmallClass_ID, A.kind, A.pith, Big_Class.BigClass_Name, Small_Class.SmallClass_Name, A.Q_content,A.Q_Note FROM Questions A,Small_Class, Big_Class WHERE A.SmallClass_ID = Small_Class.SmallClass_ID and A.BigClass_ID = Big_Class.BigClass_ID and (A.kind > 0) AND (A.kind < 5) AND( A.solved = 0) ORDER BY A.ReleaseTime DESC",0,PageSize,"Questions");rnrn //绑定数据 rn this.DataList1.DataBind();rn rnrn 查询数据调用了 DBOperate类的 SelectFormForum函数,在SelectFormForum上,鼠标右键菜单-〉转到定义,可以看到DBOperate.cs文件中的rnrn //输入SELECT语句,获得返回数据集rn public static DataTable SelectFormForum(string sql,int start,int size,string tablename)rn rn tryrn rnrn //读数据库类型rn string DBtype = ConfigurationManager.AppSettings["DBtype"];rn if (DBtype == "Accsee")rn rn //Accsee 数据库查询操作rn DBsql exsql = new DBsql();rn exsql.Open();rn OleDbDataAdapter da = new OleDbDataAdapter(sql, exsql.con);rn DataSet ds = new DataSet();rn da.Fill(ds, start, size, tablename);rn exsql.Close();rn return ds.Tables[0];rn rn elsern rn //sql server 数据库查询操作rn SqlConnection sqlConnection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DBConnection"]);rn SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);rn DataSet returns = new DataSet();rn sqlAdapter1.Fill(returns, start, size, tablename);rn return returns.Tables[0];rn rn rn catch (Exception ex)rn rn throw (ex);rn rn rnrn 训练:做一个简单的数据库(Accsee/sql server均可,根据实际情况,把 SelectFormForum函数中 if (DBtype == "Accsee")的内容化减一半就可以了),建立一个表,填入少量数据,利用上边介绍的方法把这个表里的数据读出来吧!rnrn--------------------------------------------------------------rnrn有什么不明确的,可以提出来讨论。高手和有写作经验的朋友,欢迎指点!rn 论坛

勇敢者论坛源代码分析系列(2)—url参数传递

12-22

前言:勇敢者论坛是一个开放源码的ASP.NET c#论坛,使用VS.NET 2005开发管理,可以支持两种数据库 SQL2000或Accsee。作者的开发本意,就是提供给大家学习使用的。写本系列代码分析,也是为了初学者更快的入门和进步。祝大家学习愉快!多多指教。 rn 勇敢者论坛: [url=http://bbs.doughty.cn/default2.aspx]程序演示[/url] [url=http://bbs.doughty.cn/down.aspx]源码下载[/url]rnrn 上一节讲的是简单的数据查询,这节本来想讨论一下分页查询,不过看看论坛上使用的分页方法中有关url参数传递的使用,就先说说怎么用url传递参数吧。rn 以勇敢者论坛(开放源码的ASP.NET论坛) 的 left.aspx(就是左边的树形目录)和BigcalssList.aspx?BID=XXX(大分类列表) 这两个页面为例子,看看是怎么把帖子列表显示出来的,再顺便看看Mainlist.aspx(各个分类的帖子列表),怎么处理多个参数。rn 在left.aspx中,我们看到了,实际显示树中分类内容的部分都在这个用户控件中,就是Menus.ascx,在这个文件中,我们可以看到一个<%=text%>,其上边的那个table,是一些固定的栏目,这个text,在Menus.ascx.cs代码中,具体的付值,最终拼出了我们所看到的树形结构。rnrn protected void Page_Load(object sender, System.EventArgs e)rn rn // 在此处放置用户代码以初始化页面rn text=MenuLoad();rn rnrn private string MenuLoad()rn rn //填充树干的内容rn string trees="",bs="";rn int i=1;rn BT=DBOperate.SelectFormForum("SELECT BigClass_ID, BigClass_Name, Enable FROM Big_Class WHERE (Enable = 1)");rn ST=DBOperate.SelectFormForum("SELECT SmallClass_ID, BigClass_ID, SmallClass_Name, Enable FROM Small_Class WHERE (Enable = 1)");rn DataRow [] drs = BT.Select("");rnrn foreach( DataRow r in drs )rn rn trees+=" "+r["bigclass_Name"].ToString()+" ";rn bs="";rn trees += " " + bs + " ";rn string parentid=r["bigclass_ID"].ToString();rn trees+=CreateNode(parentid)+"";rn i++;rn rn return trees;rn rnrn private string CreateNode(string parentid)rn rn //填充树枝的内容rn string Nodes="";rn DataRow [] drsr = ST.Select("BigClass_ID = "+parentid);rn foreach( DataRow rw in drsr )rn rn Nodes=Nodes+"·"+rw["SmallClass_Name"].ToString()+"";rn rn return Nodes;rn rnrn----------------rnrn 这里,要想更直观的看到结果,不如在运行程序以后,在default2.aspx的左边,也就是树形所在的leftFrame中,找个空地方,鼠标右键-〉查看源文件,在这里可以看到最终的输出结果。rnrn 在上边代码中,可以找到这么一句:bs=""+r["bigclass_Name"].ToString()+"";这句,就是为了调用BigcalssList.aspx的后边的?BID=就是要传递的大分类id,r["bigclass_ID"]会根据数据库中不同的数据,给BID提供具体的编号。rnrn 树枝中调用 Nodes=Nodes+"·"+rw["SmallClass_Name"].ToString()+""; 拼成调用Mainlist.aspx的地址串。rnrn 运行论坛,当鼠标划过树形的大分类,比如大众社区,IE状态栏上会显示.../BigcalssList.aspx?BID=1,小分类上,则显示:.../Mainlist.aspx?solved=0&BID=1&SID=210&Page=1,这里我们可以比较出来,传递参数,无非就是把具体的页面地址后面加上“?参数名1=参数值1“,而多个参数之间只需要用&隔开。rnrn 那么如何接收参数呢?打开 BigcalssList.aspx.cs,Request.QueryString["BID"]就是读取传过来的 BID参数的语句。Mainlist.aspx.cs 也一样,Request.QueryString["BID"],Request.QueryString["SID"],Request.QueryString["solved"]等,就是读取参数的语句了,读取以后,按自己的需要进行处理就可以了。rnrn 先就说这些把,自己做做测试把。rnrn--------------------------------------------------------------rnrn有什么不明确的,可以提出来讨论。高手和有写作经验的朋友,欢迎指点!rn 论坛

勇敢者论坛源代码分析系列(3)—分页查询

12-29

前言:勇敢者论坛是一个开放源码的ASP.NET c#论坛,使用VS.NET 2005开发管理,可以支持两种数据库 SQL2000或Accsee。作者的开发本意,就是提供给大家学习使用的。写本系列代码分析,也是为了初学者更快的入门和进步。祝大家学习愉快!多多指教。 rn 勇敢者论坛: [url=http://bbs.doughty.cn/default2.aspx]程序演示[/url] [url=http://bbs.doughty.cn/down.aspx]源码下载[/url]rnrn 前两节我们讲了简单的数据查询和url参数传递,这节我们综合上述两种技巧,实现以下分页查询。rn 以勇敢者论坛(开放源码的ASP.NET论坛) 的 Mainlist.aspx(就是各个分类的帖子列表的页面)为例,看看具体是怎么实现的。rnrn 在Mainlist.aspx中,找到,这就是我们显示列表用的组件。在代码的BindGrid()函数中是实现的主要代码,我把重点的部分弄出来,标示以下rnrn public void BindGrid() rn rn 。。。rnrn int BID,SID,solved;rn if ((Request.QueryString["BID"]==null)||(Request.QueryString["SID"]==null))rn rn BID=1;rn SID=200;rn rn elsern rn BID=System.Convert.ToInt32(Request.QueryString["BID"]);rn SID=System.Convert.ToInt32(Request.QueryString["SID"]);rn rn 。。。rnrn PageSize=System.Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["MainList"]);rn CurrentPage = 0; rn //计算总共有多少记录rn int RecordCount = DBOperate.CalculateQRecord(BID, SID,solved);rn lblRecordCount.Text = RecordCount.ToString();rn //计算总共有多少页rn PageCount = (RecordCount+PageSize-1)/PageSize;rn if (PageCount<=0)rn PageCount=1;rn lblPageCount.Text = PageCount.ToString();rn //获取页面参数rn if (Request.QueryString["Page"] != null)rn CurrentPage=Convert.ToInt32(Request.QueryString["Page"]);rn elsern CurrentPage=1;rn if (PageCount 0) AND (kind < 5) AND (solved =" + solved + ") ORDER BY kind DESC, ReleaseTime DESC", StartIndex, PageSize, "Questions");rn this.Page.DataBind();rnrn lnkNext.Enabled = true;rn lnkPrev.Enabled = true;rn if(CurrentPage==(PageCount))rn rn lnkNext.Enabled = false;rn rn elsern lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?solved="+solved+"&BID="+ BID.ToString()+"&SID="+ SID.ToString()+"&Page=" + Convert.ToString(CurrentPage+1);rn if(CurrentPage==1)rn lnkPrev.Enabled = false;rn elsern lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?solved="+solved+"&BID="+ BID.ToString()+"&SID="+ SID.ToString()+"&Page=" + Convert.ToString(CurrentPage-1);rn lblCurrentPage.Text = CurrentPage.ToString();rnrn 。。。rnrn rnrn 其中,最重点的是: this.DL_Main.DataSource = DBOperate.SelectFormForum("SELECT Q_ID, author,Questions.Q_Note, Q_content, ImageName, HiteCounter, ReleaseTime,ReferTime, BigClass_ID, SmallClass_ID, AnsCounter, kind, solved FROM Questions WHERE (SmallClass_ID = " + SID + ") AND (kind > 0) AND (kind < 5) AND (solved =" + solved + ") ORDER BY kind DESC, ReleaseTime DESC", StartIndex, PageSize, "Questions");rnrn DBOperate.SelectFormForum这个函数在App_Code/DBOperate.cs中,rn public static DataTable SelectFormForum(string sql,int start,int size,string tablename)rn rn tryrn rn //读数据库类型rn string DBtype = ConfigurationManager.AppSettings["DBtype"];rn if (DBtype == "Accsee")rn rn //Accsee 数据库查询操作rn DBsql exsql = new DBsql();rn exsql.Open();rn OleDbDataAdapter da = new OleDbDataAdapter(sql, exsql.con);rn DataSet ds = new DataSet();rn da.Fill(ds, start, size, tablename);rn exsql.Close();rn return ds.Tables[0];rn rn elsern rn //sql server 数据库查询操作rn SqlConnection sqlConnection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DBConnection"]);rn SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);rn DataSet returns = new DataSet();rn sqlAdapter1.Fill(returns, start, size, tablename);rn return returns.Tables[0];rn rn rn catch (Exception ex)rn rn throw (ex);rn rn rnrnrn 实现分页的方法很多,这里仅提供了这种供大家参考,记得吴旗娃给提供了一个专门分页的组件也很棒,有空大家可以研究研究。总之,个人认为,作什么都是实用为主,只要能够满足需求,就是好的方法,正所谓“不管黑猫白猫,抓住耗子就是好猫”,没有最好,只有更好,希望大家能够多注重实用(个人观点,欢迎拍砖)。rnrn 先就说这些把,自己做做测试把。rnrn--------------------------------------------------------------rnrn有什么不明确的,可以提出来讨论。高手和有写作经验的朋友,欢迎指点!rn 论坛

没有更多推荐了,返回首页