15、ASP.NET MVC入門到精通——MVC-路由


本系列目錄: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
現在再次訪問/Admin/Home/Index就可以得到正確結果了,並且你可以發現Index.cshtml已經被復制到MvcApplication1/Areas/Admin/Views/Home目錄里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM