本系列目錄:ASP.NET MVC4入門到精通系列目錄匯總
Routing(路由) – URL
url 作為廣泛使用的Web用戶接口,需要被重視
好的Url應該滿足如下條件:
- URL應為獲取某種資源提供信息,不一定是物理文件路徑
- 簡短易於記憶和拼寫輸入
- 可以反映出站點結構
- 應該是【可拆分】,用戶移除末尾,進而獲得更高層次信息
- 持久、不應改變
下面兩種url哪種你更喜歡呢?
http://www.cnblogs.com/jiekzou/1.html
http://www.cnblogs.com/jiekzou/1
如果是后者,那服務器怎么識別呢?
ASP.NET MVC 使用路由機制完成由url到具體調用方法的映射過程
注:傳統上,url代表服務器磁盤上的物理文件
Routing(路由)的作用
匹配傳入的請求(不匹配服務器物理文件),並將請求映射到【控制器】的具體操作【Action方法】和 【參數】
調用並執行對應控制器類的Action方法
Global.asax.cs文件中定義了路由的識別規則
Routes.MapRoute( "Default", // 1.路由名稱 "{controller}/{action}/{id}", // 2.帶有參數的URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 3.參數默認值 );
注:{controller}和{action}是特定參數名,不能改
RequestContext.RouteValueDictionary
SEO:Search Engine Optimization
Routing(路由)包含字面值的URL
路由URL在段中也允許包含【字面值】,如:
/jiekzou/{controller}/{action}/{id}
規定第一個段必須以 jiekzou 開頭,才能與該路由匹配,如:
/jiekzou/home/index/1
URL中可以字面量和參數混合在一期,如:
注:不能有兩個連續的url參數 :{controller}{action}-{id}
路由約束
允許URL段使用正則表達式來限制路由是否匹配請求
routes.MapRoute( "blog", // 路由名稱 "{controller}/{action}/{id}", // 帶有參數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional },// 參數默認值 new{controller=@"\d{4}",action=@"\d{2}"} );
路由按照先后順序與傳入的URL匹配,直到匹配成功為主
命名路由
生成指定路由名的 url超鏈接
@Html.RouteLink("test", "Default",
new {contorller="home",action ="index",id=1 } );
注:會按照找到的路由規則生成超鏈接(沒有使用默認值)
Action返回不同值
ViewResult – 執行並讀取指定的 完整視圖
PartialViewResult – 指定並讀取指定的 分部視圖
分部視圖:主要為某個頁面提供部分html代碼
一般用在Ajax請求()
JsonResult -> ActionResult – 請求Json數據時
return Json(object);//生成Json字符串
string – 直接返回字符串
驗證碼
public ActionResult VCodeImg() { VCode vcode = new VCode(); byte[] bytes = vcode.CreateVImg(); return File(bytes, @"image/jpeg"); }
獲取當前請求路徑:HtmlHelper.ViewContext.RequestContext.HttpContext.Request.Url.AbsolutePath;
Area 區域
MVC 項目目錄結構 缺點:
1.不利於分功能協作開發(購物車/商品管理/用戶權限管理…)
2.代碼結構臃腫…
注:可使用Area區域解決,甚至可以從物理上分開
Area 區域 – 添加
Area 區域 展示-在同一項目中
Area包含:
一套新的MVC文件夾
**AreaRegistration.cs文件
Area 區域 展示-在不同項目中
區域路由注冊類
public class WebViewsAreaRegistration : AreaRegistration { public override string AreaName { get { return "WebViews"; } } public override void RegisterArea(AreaRegistrationContext context) {
//注冊區域路由 context.MapRoute( "WebViews_default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] { "CRM.AreaController.WebViews" }//指定該路由查找控制器類的命名空間 ); } }
Demo
1. 在解決方案上面新建一個MvcApplication1的MVC4項目
2、項目上右鍵->添加->Areas,輸入"Admin"
3、添加控制器Home,並添加一個Index視圖
4、在解決方案上面新建一個MvcApplication2的MVC4項目,並且刪除Global.asax和Web.config兩個文件
5. 在根目錄新建一個AdminAreaRegistration的類,輸入如下內容:
public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } }
6. 刪除MvcApplication1項目/Areas/Admin文件夾下面的AdminAreaRegistration.cs文件以及Controllers文件夾(包括HomeController)
7. 在MvcApplication2項目的Controllers里面新建一個HomeController
8. 記得保留MvcApplication1/Areas/Admin下面的Views,並且在MvcApplication1項目里面引用MvcApplication2項目
為了使我們在MvcApplication2自動生成的View自動同步到MvcApplication1/Areas/Admin/Views 文件夾中,可以使用“生成事件(Build Event)”里的“Post-Build Event”,打開MvcApplication2的屬性,修改如下所示:
mkdir
"$(SolutionDir)$(SolutionName)\Areas\Admin\Views"
xcopy
"$(ProjectDir)Views"
"$(SolutionDir)$(SolutionName)\Areas\Admin\Views"
/S
/E
/C
/Y