網(wǎng)站性能檢測(cè)評(píng)分
注:本網(wǎng)站頁(yè)面html檢測(cè)工具掃描網(wǎng)站中存在的基本問(wèn)題,僅供參考。
aspnet網(wǎng)站開(kāi)發(fā)
什么是ASP.NET Boilerplate Project(ABP)框架 企業(yè)視頻課程
轉(zhuǎn)載自百家號(hào)作者:數(shù)據(jù)庫(kù)及DotNet開(kāi)發(fā)
使用.NET技術(shù)進(jìn)行開(kāi)發(fā)已經(jīng)多年,偶爾一次網(wǎng)絡(luò)上搜索.NET開(kāi)發(fā)框架,看到了ABP這個(gè)框架,引起了我極大的興趣,于是決定對(duì)該框架進(jìn)行深入學(xué)習(xí)和研究,并將過(guò)程全部記錄如下,對(duì)自己也是一次學(xué)習(xí)和總結(jié),同時(shí)后繼我也會(huì)分享出來(lái),幫到更多.NET開(kāi)發(fā)者在項(xiàng)目開(kāi)發(fā)中能獨(dú)擋一面,自己搭建框架,提升開(kāi)發(fā)能力和系統(tǒng)架構(gòu)水平,為今后的職業(yè)發(fā)展起到助推作用。
一、 什么是ABP框架?
ABP框架全稱(chēng)為“ASP.NET Boilerplate Project”,中文翻譯為“ ASP.NET樣板項(xiàng)目”,誕生的主要目的就是為了讓.NET程序員“秒變”架構(gòu)師,將.NET企業(yè)級(jí)項(xiàng)目的主流開(kāi)發(fā)技術(shù)、最先進(jìn)的架構(gòu)整合起來(lái),讓.NET工程師能夠更快的開(kāi)發(fā)出更好的項(xiàng)目。
ABP官方網(wǎng)站:http://aspnetboilerplate/ (這個(gè)十分重要,開(kāi)發(fā)項(xiàng)目需從官網(wǎng)生成框架源碼,從而在VS中載入框架項(xiàng)目的sln文件)
ABP GitHub源碼地址:https://github/aspnetboilerplate
ASP.NET Boilerplate是一個(gè)用最佳實(shí)踐和流行技術(shù)開(kāi)發(fā)現(xiàn)代WEB應(yīng)用程序的新起點(diǎn),它旨在成為一個(gè)通用的WEB應(yīng)用程序框架和項(xiàng)目模板。
ASP.NET Boilerplate 基于DDD的經(jīng)典分層架構(gòu)思想,實(shí)現(xiàn)了眾多DDD的概念(但沒(méi)有實(shí)現(xiàn)所有DDD的概念)。
框架所包含技術(shù)如下:
1、 .NET MVC 5、Web API 2、C# 5.0。
2、領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),如實(shí)體、倉(cāng)儲(chǔ)、領(lǐng)域服務(wù)、領(lǐng)域事件、應(yīng)用服務(wù)、數(shù)據(jù)傳輸對(duì)象、工作單元等。
3、分層體系結(jié)構(gòu):基礎(chǔ)設(shè)施層 -> 領(lǐng)域?qū)?-> 應(yīng)用層 ->展現(xiàn)層。
4、提供一個(gè)基礎(chǔ)架構(gòu)來(lái)開(kāi)發(fā)可重用可配置的模塊。
5、集成現(xiàn)今主流流行的前端開(kāi)發(fā)框架(Bootstrap、Less、AngularJs、jQuery、Modernizr、jQuery.validate、jQuery.form、jQuery.blockUI、json2等)。
6、提供一個(gè)基礎(chǔ)架構(gòu)實(shí)現(xiàn)IOC(依賴(lài)注入,主要采用Castle Windsor)。
7、支持并實(shí)現(xiàn)數(shù)據(jù)遷移,這里主要采用Entity Framework。
8、模塊化開(kāi)發(fā),每個(gè)模塊可單獨(dú)指定數(shù)據(jù)庫(kù),擁有獨(dú)立的EF DbContext。
9、包含一個(gè)簡(jiǎn)單靈活的多語(yǔ)言/本地系統(tǒng)。
10、通過(guò)EventBus實(shí)現(xiàn)服務(wù)端全局領(lǐng)域事件。
11、統(tǒng)一異常處理,應(yīng)用層不需要自己寫(xiě)異常處理代碼。
12、提供針對(duì)Application層方法的參數(shù)有效性認(rèn)證。
13、通過(guò)Application Service創(chuàng)建Web API層,無(wú)需編寫(xiě)ApiController。
14、提供基類(lèi)幫助用戶(hù)實(shí)現(xiàn)一些常見(jiàn)任務(wù)。
15、約定優(yōu)于配置。
16、Zero模塊提供身份驗(yàn)證、授權(quán)管理、用戶(hù)&角色管理、系統(tǒng)設(shè)置存取管理、審計(jì)日志。
ASP.NET ZERO 是 利用ABP框架搭建的模板項(xiàng)目,它會(huì)提供預(yù)建的頁(yè)面及強(qiáng)大的基礎(chǔ)設(shè)施架構(gòu)。利用它提供的基礎(chǔ)框架代碼能讓你快速的開(kāi)發(fā)你的應(yīng)用層。
使用說(shuō)明:
1、先編譯成功,Nuget下載ABP的依賴(lài)dll
2、在建立一個(gè)名為AbpZeroTemplate的數(shù)據(jù)庫(kù),并修改web.config里的連接字符串
3、選擇MyCompanyName.AbpZeroTemplate.Web為啟動(dòng)項(xiàng),F(xiàn)5運(yùn)行,此時(shí)會(huì)自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)
4、VS菜單:工具->Nuget 程序包管理器->程序包管理器控制臺(tái)
默認(rèn)項(xiàng)目里選擇:MyCompanyName.AbpZeroTemplate.EntityFramework
PM>update-database 回車(chē)
5、再次F5運(yùn)行即可進(jìn)入登錄,初始帳號(hào):admin 密碼:123qwe
6、關(guān)于重命名查找:namespace MyCompanyName. 替換為:namespace ABC.
其中,ABP的體系結(jié)構(gòu)圖如下:
一個(gè)簡(jiǎn)單的解決方案,大致包含5個(gè)項(xiàng)目,每一層可以用一個(gè)或多個(gè)程序集來(lái)實(shí)現(xiàn)。
1、領(lǐng)域?qū)樱―omain)
領(lǐng)域?qū)泳褪菢I(yè)務(wù)層,是一個(gè)項(xiàng)目的核心,所有業(yè)務(wù)規(guī)則都應(yīng)該在領(lǐng)域?qū)訉?shí)現(xiàn)。
實(shí)體(Entity)實(shí)體代表業(yè)務(wù)領(lǐng)域的數(shù)據(jù)和操作,在實(shí)踐中,通過(guò)用來(lái)映射成數(shù)據(jù)庫(kù)表。
倉(cāng)儲(chǔ)(Repository)倉(cāng)儲(chǔ)用來(lái)操作數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)存取。倉(cāng)儲(chǔ)接口在領(lǐng)域?qū)佣x,而倉(cāng)儲(chǔ)的實(shí)現(xiàn)類(lèi)應(yīng)該寫(xiě)在基礎(chǔ)設(shè)施層。
領(lǐng)域服務(wù)(Domain service)當(dāng)處理的業(yè)務(wù)規(guī)則跨越兩個(gè)(及以上)實(shí)體時(shí),應(yīng)該寫(xiě)在領(lǐng)域服務(wù)方法里面。
領(lǐng)域事件(Domain Event)在領(lǐng)域?qū)幽承┨囟ㄇ闆r發(fā)生時(shí)可以觸發(fā)領(lǐng)域事件,并且在相應(yīng)地方捕獲并處理它們。
工作單元(Unit of Work)工作單元是一種設(shè)計(jì)模式,用于維護(hù)一個(gè)由已經(jīng)被修改(如增加、刪除和更新等)的業(yè)務(wù)對(duì)象組成的列表。它負(fù)責(zé)協(xié)調(diào)這些業(yè)務(wù)對(duì)象的持久化工作及并發(fā)問(wèn)題。
2、應(yīng)用層(Application)
應(yīng)用層提供一些應(yīng)用服務(wù)(Application Services)方法供展現(xiàn)層調(diào)用。一個(gè)應(yīng)用服務(wù)方法接收一個(gè)DTO(數(shù)據(jù)傳輸對(duì)象)作為輸入?yún)?shù),使用這個(gè)輸入?yún)?shù)執(zhí)行特定的領(lǐng)域?qū)硬僮?,并根?jù)需要可返回另一個(gè)DTO。在展現(xiàn)層到領(lǐng)域?qū)又g,不應(yīng)該接收或返回實(shí)體(Entity)對(duì)象,應(yīng)該進(jìn)行DTO映射。一個(gè)應(yīng)用服務(wù)方法通常被認(rèn)為是一個(gè)工作單元(Unit of Work)。用戶(hù)輸入?yún)?shù)的驗(yàn)證工作也應(yīng)該在應(yīng)用層實(shí)現(xiàn)。ABP提供了一個(gè)基礎(chǔ)架構(gòu)讓我們很容易地實(shí)現(xiàn)輸入?yún)?shù)有效性驗(yàn)證。建議使用一種像AutoMapper這樣的工具來(lái)進(jìn)行實(shí)體與DTO之間的映射。
3、基礎(chǔ)設(shè)施層(Infrastructure)
當(dāng)在領(lǐng)域?qū)又袨槎x了倉(cāng)儲(chǔ)接口,應(yīng)該在基礎(chǔ)設(shè)施層中實(shí)現(xiàn)這些接口。可以使用ORM工具,例如EntityFramework或NHibernate。ABP的基類(lèi)已經(jīng)提供了對(duì)這兩種ORM工具的支持。數(shù)據(jù)庫(kù)遷移也被用于這一層。
4、Web與展現(xiàn)層(Web&Presentation)
Web層使用ASP.NET MVC和Web API來(lái)實(shí)現(xiàn)??煞謩e用于多頁(yè)面應(yīng)用程序(MPA)和單頁(yè)面應(yīng)用程序(SPA)。在SPA中,所有資源被一次加載到客戶(hù)端瀏覽器中(或者先只加載核心資源,其他資源懶加載),然后通過(guò)AJAX調(diào)用服務(wù)端WebApi接口獲取數(shù)據(jù),再根據(jù)數(shù)據(jù)生成HTML代碼。不會(huì)整個(gè)頁(yè)面刷新。現(xiàn)在已經(jīng)有很多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以使用任何類(lèi)似的前端框架,但是ABP提供了一些幫助類(lèi),讓我們更方便地使用AngularJs和DurandalJs。
在經(jīng)典的多頁(yè)面應(yīng)用(MPA)中,客戶(hù)端向服務(wù)器端發(fā)出請(qǐng)求,服務(wù)器端代碼(ASP.NET MVC控制器)從數(shù)據(jù)庫(kù)獲得數(shù)據(jù),并且使用Razor視圖生成HTML。這些被生成后的HTML頁(yè)面被發(fā)送回客戶(hù)端顯示。每顯示一個(gè)新的頁(yè)面都會(huì)整頁(yè)刷新。
SPA和MPA涉及到完全不同的體系結(jié)構(gòu),也有不同的應(yīng)用場(chǎng)景。一個(gè)管理后臺(tái)適合用SPA,博客就更適合用MPA,因?yàn)樗诒凰阉饕孀ト ?/p>
SignalR是一種從服務(wù)器到客戶(hù)端發(fā)送推送通知的完美工具。它能給用戶(hù)提供豐富的實(shí)時(shí)的體驗(yàn)。
已經(jīng)有很多客戶(hù)端的Javascript框架或庫(kù),JQuery是其中最流行的,并且它有成千上萬(wàn)免費(fèi)的插件。使用Bootstrap可以讓我們更輕松地完成寫(xiě)Html和CSS的工作。
ABP也實(shí)現(xiàn)了根據(jù)Web API接口自動(dòng)創(chuàng)建 Javascript的代碼函數(shù),來(lái)簡(jiǎn)化JS對(duì)Web Api的調(diào)用。還有把服務(wù)器端的菜單、語(yǔ)言、設(shè)置等生成到JS端。(但是在我自己的項(xiàng)目中,我是把這些自動(dòng)生成功能關(guān)閉的,因?yàn)楸匾圆皇呛艽?,而這些又會(huì)比較影響性能)。
ABP會(huì)自動(dòng)處理服務(wù)器端返回的異常,并以友好的界面提示用戶(hù)。
5、其他層:
ABP使用Castle Windsor為整個(gè)程序框架提供依賴(lài)注入的功能。使用Log4Net日志記錄組件,提供給其他各層調(diào)用以進(jìn)行日志記錄。
WebForm和ASP.NET MVC,為什么MVC更好一些? 行業(yè)視頻課程
ASP.NET Webform 后臺(tái)代碼(behind code)—— 福音與詛咒
我們已經(jīng)在項(xiàng)目開(kāi)發(fā)中使用過(guò)ASP.NET Webform技術(shù),大家會(huì)發(fā)現(xiàn)它更接近可視化設(shè)計(jì),換句話(huà)說(shuō),開(kāi)發(fā)者只需要從設(shè)計(jì)面板中拖拽控件即可完成UI,接著在behind code中實(shí)現(xiàn)邏輯代碼即可完成最后的Web頁(yè)面功能。
所以換句話(huà)說(shuō),當(dāng)你從設(shè)計(jì)面板中拖拽一個(gè)按鈕時(shí),在后臺(tái)代碼中就會(huì)生成一個(gè)button對(duì)象,你只需要在按鈕的點(diǎn)擊事件中實(shí)現(xiàn)事件響應(yīng)代碼即可。
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
// Developers write code here
}
protected void Button1_Click(object sender, EventArgs e)
當(dāng)我們?cè)陧?yè)面中拖拽一些UI元素時(shí),雙擊它們即可在后臺(tái)代碼中生成一系列事件響應(yīng)代碼,這些邏輯代碼都在ASPX.CS文件中。
這個(gè)后臺(tái)代碼文件是ASP.NET WebForm的關(guān)鍵,你可以在這個(gè)文件中應(yīng)用.NET的所有特性,包括事件、委托、HTTP協(xié)議以及Session等等。
但是這種behind code模式有5個(gè)問(wèn)題,下面我們將一一講述這5個(gè)問(wèn)題,并用MVC的設(shè)計(jì)思想來(lái)分別解決這些問(wèn)題。
問(wèn)題1:基于視圖的方案來(lái)解決基于行為的需求
我們的網(wǎng)站最終是由用戶(hù)使用的,用戶(hù)訪問(wèn)網(wǎng)站肯定會(huì)有特定的目的,網(wǎng)站要做的就是通過(guò)讓用戶(hù)的交互行為來(lái)完成其想要的目的。比如當(dāng)用戶(hù)訪問(wèn)一個(gè)購(gòu)物網(wǎng)站時(shí),也許他的交互行為會(huì)是這樣的:
· 購(gòu)買(mǎi)產(chǎn)品
· 打印發(fā)票
這些交互行為是通過(guò)按鈕點(diǎn)擊、右鍵點(diǎn)擊和瀏覽器URL實(shí)現(xiàn)的。由于這些交互都是基于HTTP協(xié)議的,所以如果我們能將這些交互行為映射到具體的一些方法上,那么整個(gè)架構(gòu)將會(huì)變得簡(jiǎn)單很多。
但是微軟做不到這樣,因?yàn)樗獙?shí)現(xiàn)可視化網(wǎng)頁(yè)編程,所以他們最終選擇了基于視圖的解決方案。
從上圖可以看出,整個(gè)請(qǐng)求過(guò)程看上去很奇怪:
· 用戶(hù)發(fā)起一個(gè)HTTP請(qǐng)求,比如HTTP POST / GET
· IIS服務(wù)器將請(qǐng)求映射到視圖
· 視圖調(diào)用頁(yè)面的生命周期,通過(guò)事件驅(qū)動(dòng),調(diào)用合適的交互方法
· 最后將交互的結(jié)果展現(xiàn)給終端用戶(hù)
因?yàn)槲④浺婚_(kāi)始就選擇了基于視圖的設(shè)計(jì)方案,所以架構(gòu)本身很難向基于用戶(hù)交互的設(shè)計(jì)思想靠攏。換句話(huà)說(shuō),當(dāng)用戶(hù)發(fā)出“購(gòu)買(mǎi)”請(qǐng)求時(shí),先是訪問(wèn)了視圖頁(yè)面“Shopping.aspx”,后臺(tái)邏輯代碼在“Shopping.aspx.cs”中,頁(yè)面生命周期中會(huì)將頁(yè)面的計(jì)算結(jié)果返回給用戶(hù)。
如果利用MVC的思想,都是基于用戶(hù)交互行為的話(huà),那么請(qǐng)求流程將會(huì)是如下所示:
問(wèn)題2:壞架構(gòu)的副作用 —— 緊耦合
當(dāng)選擇了一個(gè)錯(cuò)誤的架構(gòu)以后,未來(lái)將會(huì)出現(xiàn)很多難以解決的副作用,在ASP.NET WebForm中就出現(xiàn)了這個(gè)問(wèn)題。盡管behind code后臺(tái)代碼被分離到不同的文件中,但是ASPX.CS文件和ASPX文件卻緊密的聯(lián)系在一起,這將導(dǎo)致系統(tǒng)的耦合度很高,并且很難解耦合,這是一個(gè)很頭疼的問(wèn)題。
簡(jiǎn)單地說(shuō),我們很難將Customer.aspx.cs和CustomerDetailed.aspx簡(jiǎn)單地剝離開(kāi),后臺(tái)代碼已經(jīng)緊緊地將其捆在一起,而且也很難復(fù)用。如果我們可以將請(qǐng)求先通過(guò)action,而不通過(guò)視圖view,action得到的數(shù)據(jù)再由控制器決定由哪個(gè)view展示,那么請(qǐng)求的流程將會(huì)是這樣的:
所以我們可以很方便地控制最終結(jié)果是由移動(dòng)頁(yè)面展示還是正常頁(yè)面展示,如下代碼:
public ActionResult Index(string DeviceType)
if (viewType == "Mobile")
return View("MobileView");
else
return View("NormalView");
問(wèn)題3:HTML不是唯一的返回類(lèi)型
由于視圖view和后臺(tái)代碼behind code緊密耦合在一起,所以默認(rèn)的返回類(lèi)型就固定了,都是HTML類(lèi)型。如果你想改變類(lèi)型就必須設(shè)置Content-type和調(diào)用Response.End方法。
如果我們創(chuàng)建一個(gè)Action,返回的類(lèi)型由Action中指定,系統(tǒng)就可以在同一個(gè)action中根據(jù)不同條件輸出不同的返回類(lèi)型。代碼如下:
public ActionResult Index(string viewType)
if (viewType == "JSON")
return Json(new Customer(), JsonRequestBehavior.AllowGet);
return View("DisplayCustomer", new Customer());
問(wèn)題4:視圖和數(shù)據(jù)的靈活組合
Webform是視圖優(yōu)先的架構(gòu),所以視圖決定了展現(xiàn)的數(shù)據(jù),因此視圖的擴(kuò)展性就很差,如果遇到復(fù)雜的數(shù)據(jù)結(jié)構(gòu),這種方式就顯得力不從心了。
但是如果是行為優(yōu)先的架構(gòu)的話(huà),當(dāng)我們觸發(fā)action時(shí),action可以根據(jù)不同的請(qǐng)求選擇不同的數(shù)據(jù)模型和視圖結(jié)構(gòu),如下圖所示:
在MVC中,你可以在不同的view中選擇相同的數(shù)據(jù)模型,比如下面的代碼,customerdata數(shù)據(jù)既可以綁定在DetailCustomer視圖中,也可以綁定在Customer視圖中。
public ActionResult Index(string ViewName,Customer customerdata)
if (ViewName == "Detailed")
return View("DetailCustomer",customerdata);
return View("Customer",customerdata);
但這在WebForm中實(shí)現(xiàn)起來(lái)是非常麻煩的。
問(wèn)題5、將behind code當(dāng)做普通的類(lèi)來(lái)進(jìn)行單元測(cè)試
behind code后臺(tái)代碼在WebForm中是一個(gè)非常龐大的類(lèi),并且不能簡(jiǎn)單地實(shí)例化。要知道WebForm是繼承于Page類(lèi)的,Page類(lèi)不能直接實(shí)例化,因?yàn)樗刑嗟囊蕾?lài)項(xiàng)。
public void Button1_Click(object sender, EventArgs e)
Session["SomeSession"] = "Is this set";
為什么我們想要實(shí)例化Page類(lèi)呢?其中一個(gè)原因就是可以方便單元測(cè)試。比如我要測(cè)試一個(gè)按鈕點(diǎn)擊事件,用來(lái)檢查Session是否設(shè)置成功。在WebForm中的代碼看起來(lái)不是那么舒服:
[TestMethod]
public void TestMethod1()
WebApplication22.WebForm1 obj = new WebApplication22.WebForm1();
obj.Button1_Click(this, new EventArgs());
并且運(yùn)行時(shí)還會(huì)拋出一個(gè)異常:
在MVC中,這個(gè)類(lèi)變成了一個(gè)普通類(lèi),我們可以在測(cè)試工程中將它實(shí)例化,并對(duì)類(lèi)里面的屬性方法、Session、ViewBag 、 TempData等進(jìn)行單元測(cè)試。
public class HomeController : Controller // this class is simple
public ActionResult Index()
return View("SomeView");
所以是否選擇MVC解決方案?
從WebForm架構(gòu)切換到MVC架構(gòu),我們需要做以下幾件事情:
· 將behind code中的代碼轉(zhuǎn)移到controller類(lèi)中,并將原來(lái)的方法轉(zhuǎn)換成action方法。
· 中間層用數(shù)據(jù)模型和邏輯接口代替。
· 視圖view只用來(lái)展現(xiàn)數(shù)據(jù)和頁(yè)面布局。
· DAL層和其他層沒(méi)有什么變化,因?yàn)樗蚥ehind code關(guān)系不大。
所以MVC架構(gòu)中,用戶(hù)的請(qǐng)求分為下面3個(gè)步驟:
· 終端用戶(hù)發(fā)送請(qǐng)求,路由器將請(qǐng)求路由到合適的Controller,Controller是邏輯實(shí)體和行為Action的集合。
· Controller將請(qǐng)求映射到特定的Action。
· Action有兩個(gè)任務(wù),第一是獲取合適的數(shù)據(jù),第二是將這些數(shù)據(jù)和視圖View綁定起來(lái)。Action創(chuàng)建數(shù)據(jù)模型,并將數(shù)據(jù)模型連接到指定View,輸出最終的相應(yīng)結(jié)果。
Asp.Net MVC開(kāi)發(fā)實(shí)例教程 三層構(gòu)架(初學(xué)篇)網(wǎng)站開(kāi)發(fā)教程 推廣視頻課程
在上一篇文章中簡(jiǎn)單介紹了《SQL Server基礎(chǔ)教學(xué)S ql分頁(yè)查詢(xún)每頁(yè)10條數(shù)據(jù)》介紹數(shù)據(jù)增刪改查和在Sql中分頁(yè)查詢(xún)今天我們就綜合講解網(wǎng)站開(kāi)發(fā)的實(shí)例教學(xué)。
在學(xué)習(xí)之前,如果你沒(méi)有看過(guò)之前的文章,我們需要準(zhǔn)備SQL Server數(shù)據(jù)庫(kù)和開(kāi)發(fā)工具VS2017,其他版本也可以建議VS2012以上的版本。好了我們先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)test和建立一張表test。
在建表之前我們需要設(shè)置主鍵并設(shè)置標(biāo)識(shí)規(guī)范為自增。
創(chuàng)建完成之后數(shù)據(jù)庫(kù)設(shè)計(jì)就就算完成了,接下來(lái)我們一個(gè)MVC項(xiàng)目。
之前簡(jiǎn)單講過(guò)MVC,我們看看下面的結(jié)構(gòu)。之后我們主要的工作就是在Controllers和Views這兩個(gè)文件里面。
細(xì)致看過(guò)課本的同學(xué)會(huì)發(fā)現(xiàn)我們做一個(gè)簡(jiǎn)單的登錄功能代碼量會(huì)在50到100行左右,這對(duì)初學(xué)者來(lái)說(shuō)都還沒(méi)理解怎么記得?。恐坝袀€(gè)大學(xué)老師說(shuō)叫我們自己背代碼,我認(rèn)為這樣不是最佳的學(xué)習(xí)方法。這里我教大家如何10行以?xún)?nèi)搞定一個(gè)登錄功能。首先我們需要建立EF實(shí)體模型步驟如下:
這里需要勾選我們需要的表。我們勾選test。
模型命名空間之后我們會(huì)經(jīng)常用到,記住了。到此開(kāi)發(fā)環(huán)境和數(shù)據(jù)庫(kù)都有了,數(shù)據(jù)庫(kù)鏈接我們可以在配置文件中看到以后需要更換數(shù)據(jù)庫(kù)地址我們只需修改Web.config里面的connectionStrings節(jié)點(diǎn)下的testEntities。我們打開(kāi)實(shí)體看看有哪些內(nèi)容呢?
現(xiàn)在我們就以注冊(cè)和登錄為例簡(jiǎn)單介紹EF、json和jquery的用法,為了以后用戶(hù)體驗(yàn)上我還是讓大家接觸一下。這里使用ajax請(qǐng)求我們看看代碼:
到這里插入和查詢(xún)都有了 那么給大家預(yù)留幾個(gè)問(wèn)題:刪除、(使用Remove方法)更新參考一下。
總結(jié):這種方法對(duì)初學(xué)者來(lái)說(shuō)簡(jiǎn)單易學(xué),相對(duì)課本上的代碼量少了很多而且很容易理解。但是這種方法使用不當(dāng)時(shí)當(dāng)數(shù)據(jù)量達(dá)到成千上萬(wàn)條會(huì)很慢影響用戶(hù)體驗(yàn),之后的教程我們將直接使用sql語(yǔ)句執(zhí)行也很簡(jiǎn)單。下面文章我們會(huì)使用layui,有興趣的可以到官網(wǎng)看看文檔。
Asp.net網(wǎng)站開(kāi)發(fā)實(shí)戰(zhàn)教程:經(jīng)典語(yǔ)錄 企業(yè)視頻課程
之前的教程分別講了數(shù)據(jù)庫(kù)基本語(yǔ)法、Asp搭建一個(gè)簡(jiǎn)單的頁(yè)面、使用EF實(shí)體模型實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查,今天我們將一個(gè)簡(jiǎn)單的《經(jīng)典語(yǔ)錄》網(wǎng)站實(shí)際開(kāi)發(fā)。當(dāng)然需要源碼研究的,等教程完成后我會(huì)發(fā)布到愛(ài)上歆隨懿恫網(wǎng)站,如果需要的可以下載來(lái)看看。希望對(duì)你有所幫助。
基本功能:
1.管理員發(fā)布語(yǔ)錄、刪除、編輯
2.留言管理:刪除留言
3.用戶(hù)前端主要顯示語(yǔ)錄、收藏語(yǔ)錄、點(diǎn)贊、登錄、注冊(cè)
簡(jiǎn)單詳情頁(yè)
簡(jiǎn)單用戶(hù)收藏頁(yè)面
功能相對(duì)簡(jiǎn)單,數(shù)據(jù)庫(kù)也比較簡(jiǎn)單,簡(jiǎn)單看一下。這里需要的可以找我要源代碼
數(shù)據(jù)庫(kù)設(shè)計(jì)完成后我們先建立模型分別為每張表建立Dal、Bll和Mode,以T_allinfo表為例:所以操作數(shù)據(jù)庫(kù)的都寫(xiě)在Bll里面。
之前我們用的是EF實(shí)體模型,現(xiàn)在我們直接使用SQL語(yǔ)句這樣的話(huà)效率上相對(duì)更2好些,還記得我嗎在講SQL語(yǔ)句的使用說(shuō)過(guò)分頁(yè)查詢(xún)并查出所有姓劉的學(xué)生按生日降序排,這里我們就需要用到相同的思路了,SQL語(yǔ)句一樣我們只需拼接一下即可。這里我們這樣傳入page, 頁(yè)面需要顯示的語(yǔ)錄條數(shù)limit
通過(guò)T_allinfoDal.Instance.GetList(sql, new { }).ToList();我們就可以獲得T_allinfo表中的數(shù)據(jù),為了便于前段處理我們將獲得的對(duì)象轉(zhuǎn)換為JSON格式。前端只需要GET方式請(qǐng)求GetinfoListList就可以獲得數(shù)據(jù)了。
好了我們看看前端,還記得angularjs使用嗎?我們只要定義ng-app="web" ng-controller="webcontroller"就可以使用數(shù)據(jù)雙向綁定
總結(jié):前端ui使用的layui框架,可以到layui官網(wǎng)學(xué)習(xí)同時(shí)也用到了angularjs 基本的思路就是這樣建議先看看源代碼。