前言
ASP.NET MVC作為微軟官方的MVC解決方案,推出有一段時間了。可以說自動推出以來,一直廣受關注。在經歷了漫長的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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

