前言
ASP.NET MVC作為微軟官方的MVC解決方案,推出有一段時間了??梢哉f自動推出以來,一直廣受關注。在經歷了漫長的Preview之后,前幾天終于推出了其 beta版。并且在官方文檔中,微軟聲明最終的正式版與beta版相比不會有大的變化。所以,對于.NET平臺的開發人員來說,是時候學習ASP.NET MVC了。
本系列文章作為一個ASP.NET MVC的入門教程,將不會長篇大論介紹其中的概念及理論。而是通過案例實踐來學習ASP.NET MVC。在這系列文章中我將逐步完成一個“公告發布系統”。我的寫作策略是:先動手做,遇到需要解釋概念和理論的時候再解釋,而不是先把概念和理論解釋完再做東西。
另外,我還有幾點要說明的:
1.為了將大家的關注點充分集中在ASP.NET MVC上,這個Demo的業務處理將使用Mock的方式。即不會真正去訪問數據庫,而是虛擬一些數據。
2.本Demo將不考慮任何美工問題。
下面,讓我們一起開始ASP.NET MVC 400電話 電子公告之旅吧。在這一篇中,我們將做完所有的準備工作。
配置環境
如果您還沒有安裝ASP.NET MVC的話,請到 這里下載安裝 。
下載后,按提示安裝就可以了。
新建項目
安裝完ASP.NET MVC后,在VS里新建一個項目,可以看到有一個“ASP.NET MVC Web Application”的選項,選擇它,新建一個項目,并命名為“MVCDemo”。
建完項目后,可以看到默認情況下已經建立了很多文件夾,這里簡略說一下各個文件夾的作用。
Content——存放應用需要的一些資源文件,如圖片、CSS等。
Controllers——存放控制器類。
Models——存放業務模型組件。
Scripts——存放JavaScript腳本文件。
Views——存放視圖。
現在不了解一些概念沒關系,后續文章將慢慢解釋。
準備工作
新建完項目后,我們要做的準備工作就是建立Mock業務模型,這樣以后我們就直接使用這些“欺騙”式的業務模型進行業務處理,而將全部關注點放在ASP.NET MVC的學習上。
首先在Models下新建三個文件夾,分別叫做Entities、Interfaces、MockModels,分別用來存放實體類、接口及Mock業務模型。
?
Entities下有兩個類:CategoryInfo和AnnounceInfo,分別是公告類別和公告的實體類。具體代碼如下:
CategoryInfo.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCDemo.Models.Entities { /// <summary> /// 分類實體類 /// </summary> public class CategoryInfo { public int ID { get; set; } public string Name { get; set; } } } |
AnnounceInfo.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCDemo.Models.Entities { /// <summary> /// 公告實體類 /// </summary> public class AnnounceInfo { public int ID { get; set; } public string Title { get; set; } public string Content { get; set; } } } |
接下來,我們將定義兩個接口,分別是公告類別服務和公告服務必須實現的接口。這兩個接口放在Interfaces下。
ICategoryService.cs:
- using ?System; ??
- using ?System.Collections.Generic; ??
- using ?System.Linq; ??
- using ?System.Text; ??
- using ?MVCDemo.Models.Entities; ??
- namespace ?MVCDemo.Models.Interfaces ??
- { ??
- ///?<summary> ??
- ///?分類服務組件接口 ??
- ///?</summary> ??
- public ? interface ?ICategoryService ??
- { ??
- ///?<summary> ??
- ///?添加分類 ??
- ///?</summary> ??
- ///?<param?name="category"></param> ??
- void ?Add(CategoryInfo?category); ??
- ???????? ///?<summary> ??
- ///?修改分類名稱 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- ///?<param?name="name"></param> ??
- void ?ChangeName( int ?id, string ?name); ??
- ???????? ///?<summary> ??
- ///?刪除分類 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- void ?Remove( int ?id); ??
- ???????? ///?<summary> ??
- ///?取得某個分類詳細信息 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- ///?<returns></returns> ??
- CategoryInfo?GetDetail( int ?id); ??
- ???????? ///?<summary> ??
- ///?取得所有分類 ??
- ///?</summary> ??
- ///?<returns></returns> ??
- List<CategoryInfo>?GetAll(); ??
- } ??
- }??
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MVCDemo.Models.Entities; namespace MVCDemo.Models.Interfaces { /// <summary> /// 分類服務組件接口 /// </summary> public interface ICategoryService { /// <summary> /// 添加分類 /// </summary> /// <param name="category"></param> void Add(CategoryInfo category); /// <summary> /// 修改分類名稱 /// </summary> /// <param name="id"></param> /// <param name="name"></param> void ChangeName(int id,string name); /// <summary> /// 刪除分類 /// </summary> /// <param name="id"></param> void Remove(int id); /// <summary> /// 取得某個分類詳細信息 /// </summary> /// <param name="id"></param> /// <returns></returns> CategoryInfo GetDetail(int id); /// <summary> /// 取得所有分類 /// </summary> /// <returns></returns> List<CategoryInfo> GetAll(); } }?
IAnnounceService.cs
- using ?System; ??
- using ?System.Collections.Generic; ??
- using ?System.Linq; ??
- using ?System.Text; ??
- using ?MVCDemo.Models.Entities; ??
- namespace ?MVCDemo.Models.Interfaces ??
- { ??
- ///?<summary> ??
- ///?公告服務組件接口 ??
- ///?</summary> ??
- public ? interface ?IAnnounceService ??
- { ??
- ///?<summary> ??
- ///?發布公告 ??
- ///?</summary> ??
- ///?<param?name="announce"></param> ??
- void ?Release(AnnounceInfo?announce); ??
- ???????? ///?<summary> ??
- ///?修改公告信息 ??
- ///?</summary> ??
- ///?<param?name="announce"></param> ??
- void ?Notify(AnnounceInfo?announce); ??
- ???????? ///?<summary> ??
- ///?刪除公告?(http://www.my400800.cn) ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- void ?Remove( int ?id); ??
- ???????? ///?<summary> ??
- ///?取得公告詳細內容 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- ///?<returns></returns> ??
- AnnounceInfo?GetDetail( int ?id); ??
- ???????? ///?<summary> ??
- ///?取得某個分類下的所有公告 ??
- ///?</summary> ??
- ///?<param?name="categoryId"></param> ??
- ///?<returns></returns> ??
- List<AnnounceInfo>?GetByCategory(CategoryInfo?category); ??
- } ??
- }??
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MVCDemo.Models.Entities; namespace MVCDemo.Models.Interfaces { /// <summary> /// 公告服務組件接口 /// </summary> public interface IAnnounceService { /// <summary> /// 發布公告 /// </summary> /// <param name="announce"></param> void Release(AnnounceInfo announce); /// <summary> /// 修改公告信息 /// </summary> /// <param name="announce"></param> void Notify(AnnounceInfo announce); /// <summary> /// 刪除公告 (http://www.my400800.cn) /// </summary> /// <param name="id"></param> void Remove(int id); /// <summary> /// 取得公告詳細內容 /// </summary> /// <param name="id"></param> /// <returns></returns> AnnounceInfo GetDetail(int id); /// <summary> /// 取得某個分類下的所有公告 /// </summary> /// <param name="categoryId"></param> /// <returns></returns> List<AnnounceInfo> GetByCategory(CategoryInfo category); } }?
然后,我們在MockModels下建立兩個Mock業務邏輯服務模型。注意它們要各自實現自己的接口。
MockCategoryService.cs:
- using ?System; ??
- using ?System.Collections.Generic; ??
- using ?System.Linq; ??
- using ?System.Web; ??
- using ?MVCDemo.Models.Interfaces; ??
- using ?MVCDemo.Models.Entities; ??
- namespace ?MVCDemo.Models.MockModels ??
- { ??
- ///?<summary> ??
- ///?“欺騙”服務組件,用于模擬分類的業務服務 ??
- ///?</summary> ??
- public ? class ?MockCategoryService?:?ICategoryService ??
- { ??
- ///?<summary> ??
- ///?添加分類 ??
- ///?</summary> ??
- ///?<param?name="category"></param> ??
- public ? void ?Add(CategoryInfo?category) ??
- { ??
- return ; ??
- } ??
- ???????? ///?<summary> ??
- ///?修改分類名稱 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- ///?<param?name="name"></param> ??
- public ? void ?ChangeName( int ?id,? string ?name) ??
- { ??
- return ; ??
- } ??
- ???????? ///?<summary> ??
- ///?刪除分類 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- public ? void ?Remove( int ?id) ??
- { ??
- return ; ??
- } ??
- ???????? ///?<summary> ??
- ///?取得某個分類詳細信息 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- ///?<returns></returns> ??
- public ?CategoryInfo?GetDetail( int ?id) ??
- { ??
- return ? new ?CategoryInfo ??
- { ??
- ID?=?id, ??
- Name?=? "最新通告" , ??
- }; ??
- } ??
- ???????? ///?<summary> ??
- ///?取得所有分類 ??
- ///?</summary> ??
- ///?<returns></returns> ??
- public ?List<CategoryInfo>?GetAll() ??
- { ??
- List<CategoryInfo>?categories?=? new ?List<CategoryInfo>(); ??
- for ?( int ?i?=?1;?i?<=?5;?i++) ??
- { ??
- CategoryInfo?category?=? new ?CategoryInfo ??
- { ??
- ID?=?i, ??
- Name= "通告類別" +i, ??
- }; ??
- ????????????????categories.Add(category); ??
- } ??
- ???????????? return ?categories; ??
- } ??
- } ??
- }??
using System; using System.Collections.Generic; using System.Linq; using System.Web; using MVCDemo.Models.Interfaces; using MVCDemo.Models.Entities; namespace MVCDemo.Models.MockModels { /// <summary> /// “欺騙”服務組件,用于模擬分類的業務服務 /// </summary> public class MockCategoryService : ICategoryService { /// <summary> /// 添加分類 /// </summary> /// <param name="category"></param> public void Add(CategoryInfo category) { return; } /// <summary> /// 修改分類名稱 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public void ChangeName(int id, string name) { return; } /// <summary> /// 刪除分類 /// </summary> /// <param name="id"></param> public void Remove(int id) { return; } /// <summary> /// 取得某個分類詳細信息 /// </summary> /// <param name="id"></param> /// <returns></returns> public CategoryInfo GetDetail(int id) { return new CategoryInfo { ID = id, Name = "最新通告", }; } /// <summary> /// 取得所有分類 /// </summary> /// <returns></returns> public List<CategoryInfo> GetAll() { List<CategoryInfo> categories = new List<CategoryInfo>(); for (int i = 1; i <= 5; i++) { CategoryInfo category = new CategoryInfo { ID = i, Name="通告類別"+i, }; categories.Add(category); } return categories; } } }?
MockAnnounceService.cs
- using ?System; ??
- using ?System.Collections.Generic; ??
- using ?System.Linq; ??
- using ?System.Web; ??
- using ?MVCDemo.Models.Interfaces; ??
- using ?MVCDemo.Models.Entities; ??
- namespace ?MVCDemo.Models.MockModels ??
- { ??
- ///?<summary> ??
- ///?“欺騙”服務組件,用于模擬公告的業務服務 ??
- ///?</summary> ??
- public ? class ?MockAnnounceService?:?IAnnounceService ??
- { ??
- ///?<summary> ??
- ///?發布公告 ??
- ///?</summary> ??
- ///?<param?name="announce"></param> ??
- public ? void ?Release(AnnounceInfo?announce) ??
- { ??
- return ; ??
- } ??
- ???????? ///?<summary> ??
- ///?修改公告信息 ??
- ///?</summary> ??
- ///?<param?name="announce"></param> ??
- public ? void ?Notify(AnnounceInfo?announce) ??
- { ??
- return ; ??
- } ??
- ???????? ///?<summary> ??
- ///?刪除公告 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- public ? void ?Remove( int ?id) ??
- { ??
- return ; ??
- } ??
- ???????? ///?<summary> ??
- ///?取得公告詳細內容 ??
- ///?</summary> ??
- ///?<param?name="id"></param> ??
- ///?<returns></returns> ??
- public ?AnnounceInfo?GetDetail( int ?id) ??
- { ??
- return ? new ?AnnounceInfo ??
- { ??
- ID?=?id, ??
- Title?=? "第" ?+?id?+? "則公告" , ??
- Content?=? "全體同學明早九點集體做俯臥撐!" , ??
- }; ??
- } ??
- ???????? ///?<summary> ??
- ///?取得某個分類下的所有公告 ??
- ///?</summary> ??
- ///?<param?name="categoryId"></param> ??
- ///?<returns></returns> ??
- public ?List<AnnounceInfo>?GetByCategory(CategoryInfo?category) ??
- { ??
- List<AnnounceInfo>?announces?=? new ?List<AnnounceInfo>(); ??
- for ?( int ?i?=?1;?i?<=?10;?i++) ??
- { ??
- AnnounceInfo?announce?=? new ?AnnounceInfo ??
- { ??
- ID?=?i, ??
- Title?=?category.Name+? "的第" ?+?i?+? "則公告" , ??
- Content?=? "全體同學明早九點集體做俯臥撐!" , ??
- }; ??
- ????????????????announces.Add(announce); ??
- } ??
- ???????????? return ?announces; ??
- } ??
- } ??
- }??
using System; using System.Collections.Generic; using System.Linq; using System.Web; using MVCDemo.Models.Interfaces; using MVCDemo.Models.Entities; namespace MVCDemo.Models.MockModels { /// <summary> /// “欺騙”服務組件,用于模擬公告的業務服務 /// </summary> public class MockAnnounceService : IAnnounceService { /// <summary> /// 發布公告 /// </summary> /// <param name="announce"></param> public void Release(AnnounceInfo announce) { return; } /// <summary> /// 修改公告信息 /// </summary> /// <param name="announce"></param> public void Notify(AnnounceInfo announce) { return; } /// <summary> /// 刪除公告 /// </summary> /// <param name="id"></param> public void Remove(int id) { return; } /// <summary> /// 取得公告詳細內容 /// </summary> /// <param name="id"></param> /// <returns></returns> public AnnounceInfo GetDetail(int id) { return new AnnounceInfo { ID = id, Title = "第" + id + "則公告", Content = "全體同學明早九點集體做俯臥撐!", }; } /// <summary> /// 取得某個分類下的所有公告 /// </summary> /// <param name="categoryId"></param> /// <returns></returns> public List<AnnounceInfo> GetByCategory(CategoryInfo category) { List<AnnounceInfo> announces = new List<AnnounceInfo>(); for (int i = 1; i <= 10; i++) { AnnounceInfo announce = new AnnounceInfo { ID = i, Title = category.Name+ "的第" + i + "則公告", Content = "全體同學明早九點集體做俯臥撐!", }; announces.Add(announce); } return announces; } } }?
可以看到,這兩個類并沒有訪問數據庫,也沒有實現真正的業務邏輯,而不過是“捏造”了一些數據騙騙我們的表示層而已。
最后,我們要建立一個生成業務邏輯模型的生成器,用來實現表示層和業務邏輯層的解耦。當然,為了簡化復雜度,這里沒有使用依賴注入機制。下面是我們生成器的代碼,這個類是直接放在Models下的。
- using ?System; ??
- using ?System.Collections.Generic; ??
- using ?System.Linq; ??
- using ?System.Web; ??
- using ?MVCDemo.Models.Interfaces; ??
- using ?MVCDemo.Models.MockModels; ??
- ??
- ??
- namespace ?MVCDemo.Models ??
- { ??
- ///?<summary> ??
- ///?服務組件生成類,用于生成業務服務組件 ??
- ///?</summary> ??
- public ? sealed ? class ?ServiceBuilder ??
- { ??
- ///?<summary> ??
- ///?創建分類服務組件 ??
- ///?</summary> ??
- ///?<returns>分類服務組件</returns> ??
- public ? static ?ICategoryService?BuildCategoryService() ??
- { ??
- return ? new ?MockCategoryService(); ??
- } ??
- ??
- ??
- ???????? ///?<summary> ??
- ///?創建公告服務組件 ??
- ///?</summary> ??
- ///?<returns>公告服務組件</returns> ??
- public ? static ?IAnnounceService?BuildAnnounceService() ??
- { ??
- return ? new ?MockAnnounceService(); ??
- } ??
- } ??
- }??
using System; using System.Collections.Generic; using System.Linq; using System.Web; using MVCDemo.Models.Interfaces; using MVCDemo.Models.MockModels; namespace MVCDemo.Models { /// <summary> /// 服務組件生成類,用于生成業務服務組件 /// </summary> public sealed class ServiceBuilder { /// <summary> /// 創建分類服務組件 /// </summary> /// <returns>分類服務組件</returns> public static ICategoryService BuildCategoryService() { return new MockCategoryService(); } /// <summary> /// 創建公告服務組件 /// </summary> /// <returns>公告服務組件</returns> public static IAnnounceService BuildAnnounceService() { return new MockAnnounceService(); } } }?
OK,到這里,我們的準備工作就做完了。完成這些后,系統的目錄結構如下圖所示:
小結
在這篇文章中,我們只是講了一下這個系列文章要做什么,以及為案例做了一些準備工作。從下篇開始,我們將正式開始使用ASP.NET MVC完成這個案例。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
