多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > web前端 > htmlcss > 不拖控件ASP.NET――NVelocity(2)

不拖控件ASP.NET――NVelocity(2)

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-01-28 08:58:52 閱讀次數(shù):3536次

    上節(jié)課我們講述了NVelocity的簡(jiǎn)單利用,但是沒(méi)有和數(shù)據(jù)庫(kù)打交道,這次我們來(lái)和數(shù)據(jù)庫(kù)連接實(shí)現(xiàn)人員的增刪改查。

  1.      上篇博客回顧

    鏈接:http://blog.csdn.net/u010955843/article/details/42528761

    開(kāi)講之前,我們先來(lái)回顧上1節(jié)課講的內(nèi)容,主要是兩個(gè)頁(yè)面,1個(gè)是1般處理程序的頁(yè)面,另外一個(gè)是渲染后的模板。

    ?  機(jī)制

    上篇博客中我們建立1個(gè)person類(lèi),并且在1般處理程序中對(duì)其進(jìn)行了賦值,以后交給了模板(html)進(jìn)行數(shù)據(jù)填充,渲染成html頁(yè),以后生成的純html文本返回給1般處理程序?qū)ⅲ?般處理程序?qū)⑵浞祷亟o閱讀器進(jìn)行解析,并且顯示。     

    ?  好處

    實(shí)現(xiàn)了數(shù)據(jù)和邏輯和界面的分離:數(shù)據(jù)給了模板(1般由html擔(dān)當(dāng)),最后1般處理程序拿到渲染html進(jìn)行輸出;模板不管數(shù)據(jù)來(lái)源,只是知道表格中需要設(shè)置幾行幾列;1般處理程序只是取數(shù)據(jù),傳給模板,不管模板會(huì)把數(shù)據(jù)渲染成甚么模樣的,也就是各自只是負(fù)責(zé)自己的那1塊就能夠了

  2.      與數(shù)據(jù)庫(kù)連接實(shí)現(xiàn)人員增刪改查

    上節(jié)課我們只是在1般處理程序中寫(xiě)的數(shù)據(jù)源對(duì)象,那末在傳統(tǒng)web開(kāi)發(fā)NVelocity如何數(shù)據(jù)庫(kù)進(jìn)行交互的呢,我們先來(lái)介紹程序編寫(xiě)的步驟。

    ?  建立數(shù)據(jù)庫(kù)并且建表

     可以自己定,我們的庫(kù)為CRUDTest,表明為Persons


    設(shè)置Id為自增的,我們可以手動(dòng)輸入幾條記錄

    ?  CommonHelper

    和上次1樣,我們首先下載NVelocity的DLL,以后將其添加到建立的相應(yīng)項(xiàng)目下,直接拖進(jìn)項(xiàng)目下面便可,以后添加對(duì)它的援用便可。

    上次我們是將模板寫(xiě)在1個(gè)1般處理程序中,但是我們知道這樣的只是適用1個(gè)或少數(shù)的處理程序,要是想要到達(dá)模板的復(fù)用或方便的使用,我們可以將其進(jìn)行封裝,放到1個(gè)類(lèi)中便可,這樣實(shí)現(xiàn)了方法的復(fù)用。

    我們知道這里只是有兩個(gè)參數(shù)不1樣,行將渲染的模板,另外一個(gè)是將要填充模板的文件或數(shù)據(jù)。

    具體代碼以下:

<strong><span style="font-family:Microsoft YaHei;font-size:14px;">using NVelocity; using NVelocity.App; using NVelocity.Runtime; using System; using System.Collections.Generic; using System.Linq; using System.Web; //using NVelocity;using NVelocity.App;using NVelocity.Runtime;必須引入的 //這個(gè)類(lèi)用于封裝Nvelocity模板的渲染 namespace yinqingmuban { public class commonHelper { /// <summary> /// 用data數(shù)據(jù)填充templateName模板,渲染生成html返回 /// </summary> /// <param name="templateName">模板名字</param> /// <param name="data">填充模板數(shù)據(jù)</param> /// <returns></returns> public static string RenderHtml(string templateName, object data) { VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夾,我們遵從上次講的我們還是放在templates這個(gè)文件夾中,自己也能夠新建別的名字的 vltEngine.Init(); //引擎初始化 VelocityContext vltContext = new VelocityContext(); vltContext.Put("Data", data);//設(shè)置參數(shù),在模板中可以通過(guò)$data來(lái)援用 Template vltTemplate = vltEngine.GetTemplate(templateName);//渲染的html模板 System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html = vltWriter.GetStringBuilder().ToString(); return html; } } }</span></strong>

    ?  Sqlhelper

    相信大家都學(xué)過(guò)3層,這里不再做過(guò)量的介紹。封裝了1系列的增刪改查的方法,并且建立了數(shù)據(jù)庫(kù)的里連接。這里不再展現(xiàn)了

    ?  配置文件

    用于配置連接數(shù)據(jù)庫(kù)的字符串,這樣便于我們靈活更換數(shù)據(jù)庫(kù),而不用于更改代碼內(nèi)部。

<strong><span style="font-family:Microsoft YaHei;font-size:14px;"><connectionStrings> <add name="conStr" connectionString="data source=.;database=CRUDTest;uid=sa;pwd=123456;"/> </connectionStrings></span></strong>

    ?  人員顯示的1般處理程序(personlist.ashx)

這里主要是讀取數(shù)據(jù),然后把它渲染到html頁(yè)上進(jìn)行輸出。

<strong><span style="font-family:Microsoft YaHei;font-size:14px;">using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; namespace yinqingmuban { /// <summary> /// personlist 的摘要說(shuō)明 /// </summary> public class personlist : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; //context.Response.Write("Hello World"); DataTable dt = sqlHelper.ExecuteDataTable("select * from Persons"); //DataTable不是集合,所以沒(méi)法foreach遍歷,DataTable的Rows屬性 //代表表格中的數(shù)據(jù)行的集合(DataRow的集合),1般傳遞DataRowCollection //給模板方便遍歷 string html = commonHelper.RenderHtml("personlist.html", dt.Rows); context.Response.Write(html); } public bool IsReusable { get { return false; } } } }</span></strong>

    ?  建立人員列表的渲染模板(personlist.html)

<strong><span style="font-family:Microsoft YaHei;font-size:14px;"><!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf⑻"/> <title></title> </head> <body> <!-- 人員的操作處理,增刪改查 --> <a href="personEdit.ashx?Action=AddNew">新增人員</a> <!--//變量data中的每行,并且輸入每行中的每列的字段值--> <table> <thead> <tr><td>刪除</td><td>編輯</td><td>姓名</td><td>年齡</td><td>郵箱</td></tr> </thead> <tbody> #foreach($person in $Data) <tr><td><a href="personEdit.ashx?Action=Delete&Id=$person.Id">刪除</a></td><td><a href="personEdit.ashx?Action=Edit&Id=$person.Id">編輯</a></td><td>$person.Name</td><td>$person.Age</td><td>$person.Email</td></tr> #end </tbody> </table> </body> </html> </span></strong>

    ?  對(duì)列表進(jìn)行增刪改(personEdit.ashx)

<strong><span style="font-family:Microsoft YaHei;font-size:14px;">using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.Data; namespace yinqingmuban { /// <summary> /// personEdit 的摘要說(shuō)明 /// </summary> public class personEdit : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; //PersonEdit.ashx?action=AddNew //PersonEdit.ashx?action=Edit&Id=3 string action = context.Request["action"]; if (action == "AddNew") { //判斷是不是含有Save并且等于true,如果是的話(huà)就說(shuō)明是點(diǎn)擊【保存】按鈕要求來(lái)的 bool save = Convert.ToBoolean(context.Request["Save"]); if (save)//是保存 { string name = context.Request["Name"]; int age = Convert.ToInt32(context.Request["Age"]); string email = context.Request["Email"]; sqlHelper.ExecuteNonQuery("Insert into Persons(Name,Age,Email) values(@Name,@Age,@Email)", new SqlParameter("@Name", name) , new SqlParameter("@Age", age) , new SqlParameter("@Email", email)); context.Response.Redirect("personlist.ashx");//保存成功返回列表頁(yè)面 } else { //string html = CommonHelper.RenderHtml("PersonEdit.htm", new { Name = "", Age = 20, Email = "@rupeng.com" }); //定義匿名對(duì)象 Action可能與數(shù)據(jù)庫(kù)中字段重復(fù),建議分開(kāi),相干和無(wú)關(guān)的字段;New1個(gè)匿名類(lèi)型,等于在1個(gè)匿名類(lèi)中又創(chuàng)建1個(gè)匿名類(lèi), var data = new { Action = "AddNew", Person = new { Name = "", Age = 20, Email = "@rupeng.com" } }; //進(jìn)行渲染 string html = commonHelper.RenderHtml("personEdit.html", data); context.Response.Write(html); } } else if (action == "Edit") { //判斷是不是含有Save并且等于True,如果是的話(huà)說(shuō)明點(diǎn)擊了保存按鈕 bool save = Convert.ToBoolean(context.Request["Save"]); if (save) { //所有的信息服務(wù)器端盡可能不要記,盡可能通過(guò)客戶(hù)端傳遞 //服務(wù)器是1個(gè)忘記癥(無(wú)狀態(tài)),服務(wù)器只認(rèn)識(shí)Request中的信息 long id = Convert.ToInt64(context.Request["Id"]); string name = context.Request["Name"]; int age = Convert.ToInt32(context.Request["Age"]); string email = context.Request["Email"]; sqlHelper.ExecuteNonQuery("update Persons set Name=@Name,Age=@Age,Email=@Email where Id=@Id", new SqlParameter("@Id", id), new SqlParameter("@Name", name), new SqlParameter("@Age", age), new SqlParameter("@Email", email)); context.Response.Redirect("personlist.ashx"); } else { long id = Convert.ToInt64(context.Request["Id"]); DataTable dt = sqlHelper.ExecuteDataTable("select * from Persons where Id=@Id", new SqlParameter("@Id", id)); if (dt.Rows.Count <= 0) { context.Response.Write("沒(méi)有找到Id=" + id + "的數(shù)據(jù)"); } else if (dt.Rows.Count > 1) { context.Response.Write("找到多條Id=" + id + "的數(shù)據(jù)"); } else { DataRow row = dt.Rows[0]; var data = new { Action = "Edit", Person = row }; string html = commonHelper.RenderHtml("personEdit.html", data); context.Response.Write(html); } } } else if (action == "Delete") { long id = Convert.ToInt64(context.Request["Id"]); sqlHelper.ExecuteNonQuery("delete from Persons where Id=@Id", new SqlParameter("@Id",id)); context.Response.Redirect("personlist.ashx"); } else { context.Response.Write("Action參數(shù)毛病!"); } } public bool IsReusable { get { return false; } } } }</span></strong>

?  建立人員增刪改的渲染模板(personEdit.html)

<strong><span style="font-family:Microsoft YaHei;font-size:14px;"><!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf⑻"/> <title> #if($Data.Action=="AddNew") 新增用戶(hù) #else 編輯用戶(hù)$Data.Person.Name #end </title> </head> <body> <form action="personEdit.ashx" method="post"> <!--<input type="hidden" name="Action" value="AddNew" />--> <input type="hidden" name="Action" value="$Data.Action" /> <input type="hidden" name="Save" value="true" /> #if($Data.Action=="Edit") <input type="hidden" name="Id" value="$Data.Person.Id" /> #end <table style="background-color:blueviolet"> <tr><td>姓名:</td><td><input type="text" name="Name" value="$Data.Person.Name" /></td></tr> <tr><td>年齡:</td><td><input type="text" name="Age" value="$Data.Person.Age" /></td></tr> <tr><td>郵箱:</td><td><input type="text" name="Email" value="$Data.Person.Email" /></td></tr> <tr><td></td><td><input type="submit" value="保存" /></td></tr> </table> </form> </body> </html> </span></strong>

    ?  效果

    列表顯示
    點(diǎn)擊新增人員
    點(diǎn)擊編輯

    通過(guò)隱藏字段來(lái)實(shí)現(xiàn)想要的結(jié)果,在實(shí)現(xiàn)增刪改的頁(yè)面我們用了隱藏字段,隱藏字段是服務(wù)器端控件,這樣我們?cè)?a href="http://www.vxbq.cn/server/" target="_blank">服務(wù)器端可以通過(guò)隱藏字段的name來(lái)取得其相應(yīng)的值,主要是由于關(guān)于1些操作這些是不要用戶(hù)可以看到的,只是程序需要看到,故而做成了隱藏字段。

    至此我們就實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互,出現(xiàn)的效果自己可以寫(xiě)寫(xiě)代碼看1下啊。

  3.      總結(jié)

    這樣總算完善了,不然總是覺(jué)得少了些甚么,自己最近時(shí)間緊,1直沒(méi)有寫(xiě)這篇與數(shù)據(jù)庫(kù)交互的博客,在mvc中一樣存在1個(gè)引擎Razor,我們稱(chēng)之為視圖引擎,希望在這篇博客的基礎(chǔ)能夠激起你對(duì)引擎探究的好奇心,自己去看看和研究吧,相信你會(huì)感興趣的。


生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線(xiàn)----------------------------
分享到:
------分隔線(xiàn)----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产精品日韩欧美亚洲另类 | 波多野结衣在线不卡 | 国产91精品高清一区二区三区 | 亚欧成人在线 | 97av在线视频| 亚洲国产激情一区二区三区 | 美女福利视频国产免费观看 | 91精品国产色综合久久不 | 成人欧美一区二区三区在线观看 | 手机在线日韩高清理论片 | 国产一级鲁丝片 | 国产欧美综合一区二区 | 国产成人一区免费观看 | 国内精品视频 | 五月天福利视频 | 美日韩一区二区 | 亚洲成a人在线播放www | 久久精品中文字幕不卡一二区 | 亚洲一区二区三区四区在线 | 欧美多人| 国产极品美女在线观看 | 亚洲精品视频免费观看 | 中文字幕15页 | 毛片一级在线 | 日本护士毛片在线视频 | 欧美一区二区精品系列在线观看 | 午夜色视频 | 国产suv精品一区二区四区三区 | 国产精品揄拍100视频最近 | 麻豆片免费观看在线看 | 欧美福利在线 | 亚洲一区二区三区深夜天堂 | 亚洲人和日本人jzz护士 | 中文字幕亚洲专区 | 亚洲图片另类小说 | 一级毛片不卡 | 精品伊人久久久大香线蕉欧美 | 国产精品久久久久久免费 | 日韩精品中文字幕视频一区 | 99欧美精品| 亚洲天堂女人 |