ASP.NET MVC 路由


1.路由的兩個作用:a,檢查地址欄中的URL,計算出當前地址請求的是哪個controller 中的 哪個action,並且自動提取請求的參數 。
                            b, 生成URL 。
 
2 路由參數的默認值
public static void RegisterRoutes(RouteCollection routes)
{
	routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

	routes.MapRoute(
	"Default", // 路由名稱
	"{controller}/{action}/{id}", // 帶有參數的 URL
	new { controller = "Home", action = "Index", id =“defaultID”}, // 參數默認值
	);
}
 
 
3 自定義路由模式的例子。生成URL的最簡單並且最常用的辦法是在頁面中通過ActionLink這個輔助方法來完成的。
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
                        
   //自定義路由模式
   routes.MapRoute("", // 路由名稱
    "Public/{controller}/{action}", // 帶有參數的 URL
    new { controller = "Home", action = "Index"}, // 參數默認值
);
 
routes.MapRoute(
    "Default", // 路由名稱
    "{controller}/{action}/{id}", // 帶有參數的 URL
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數默認值
    );
}

 


要注意自定義的路由格式要放在通用格式的前面,因為一旦有路由北匹配上,本次的匹配操作就結束了。
 
4. 自定義參數 ,以及參數的傳遞
    首先定義一個路由
  
 routes.MapRoute(
    "Default", // 路由名稱
    "{controller}/{action}/{id}/{age}/{birthday}", // 帶有參數的 URL
    new { controller = "Home", action = "Index", id = UrlParameter.Optional ,
              age=18 ,birthday=new DateTime(1989,1,1) }, // 參數默認值
    );

public ActionResult Index( string id , int age , DateTime birthday)
{
    return View();
}    
如果我們在路由中定義了定義好了包含這三個參數的模式,然后輸入正確的URL后,路由系統就會自動從中提取出controller , action ,以及這三個參數(如果參數名匹配,並且能夠完成類型轉換的話)。
例如,我們輸入  http://mysite.com/User/Getinfo/123344/24/1989-9-16 ,路由就會提取出一下信息 ,controller=User ,action = Getinfo,
id=123344 , age=24 ,birthday=1989-9-16
 
5. 定義可變長度的參數的路由
     
 routes.MapRoute(
    "Default", // 路由名稱
    "{controller}/{action}/{id}/{*catchall}", // 帶有不定個數的參數的 URL
    new { controller = "Home", action = "Index",    
    id=UrlParameter.Optional     }, // 參數默認值
);
       這個路由能匹配所有的URL。具體匹配情況如下圖:
      
序號 URL 示例 映射結果
0 mydomain.com  controller=home,action=index
1 mydomain.com/Customer  controller=Customer,action=index
2 mydomain.com/Customer/List  controller=Customer,action=List
3 mydomain.com/Customer/List/All  controller=Customer,action=List,id=All
4 mydomain.com/Customer/List/All/Delete  controller=Customer,action=List,id=All,catchall=Delete
5 mydomain.com/Customer/List/All/Delete/Perm  controller=Customer,action=List,id=All,catchall=Delete/Perm
 
6. 定義命名空間的優先級。
    根據以上內容我們已經知道,當URL匹配上一個路由之后,就會提取路由中的信息,然后進行進一步處理。假如現在我們的某個路由提取出了一個controller為Account ,並且我們的解決方案中有不只一個名為“AccountController”的類,由於路由並不知道要調用哪個controller ,這個時候就會出現錯誤。那么,如何解決這種問題呢?我們可以在注冊路由的時候,制定某個路由有限查找controller 的命名空間,如下面的代碼所示。
        
 routes.MapRoute(
    "Default", // 路由名稱
    "{controller}/{action}/{id}", // 帶有參數的 URL
    new { controller = "Home", action = "Index", 
    id = UrlParameter.Optional }, // 參數默認值
    new string[] { "MyNamespace.Controllers" } //指定優先命名空間
);
    由此可見,控制器的類不一定要放在網站項目中的Controllers命名空間下,也可以單獨寫一個程序集,如果需要的話。
 
7. 給路由加一些約束條件
    我們可以給URL的匹配加上以下限制:
        a, 正則表達式
        b,HTTP method
    代碼如下
   
  routes.MapRoute(
    "Default", // 路由名稱
    "{controller}/{action}/{id}", // 帶有參數的 URL
    new { 
        controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional }, // 參數默認值
        //設置匹配約束
    new  {controller = "^H.*" , action ="^Index$|^About&" , 
        httpMethod=new HttpMethodConstrain("Get") } ,
   new string[] { "MyNamespace.Controllers" }  //指定優先命名空間
);
            
    這個路由就要求,controller的值必須是以字母"H"開頭的,並且action只能是Index 或者 About ,並且只能用Get方式。
    如果這些系統定義的約束條件不能滿足項目的需求,我們可以自定義約束條件,只要實現 IRouteConstraint 接口 ,然后將該類的一個實例傳給routs就可以了。代碼如下:
  
public class UserConstrain : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, 
    string  parameterName,  RouteValueDictionary values,
    RouteDirection routeDirection)
    {
    return true ; //你可以在這里做具體的操作
    }
}
        
routes.MapRoute(
    "Default", // 路由名稱
    "{controller}/{action}/{id}", // 帶有參數的 URL
    new { controller = "Home", action = "Index", id 
        =UrlParameter.Optional }, // 參數默認值
    new  {controller = "^H.*" , action ="^Index$|^About&" ,     
        httpMethod=new HttpMethodConstrain("Get") ,
    customConstrain= new  UserConstrain () } , //設置匹配約束
    new string[] { "MyNamespace.Controllers" }  //指定優先命名空間
);
                
  
8. 處理磁盤文件的映射。
    在 asp.net webForms 中,請求的地址直接映射到一個磁盤的文件。而在MVC 中,一般都是把請求交給特定的控制器來執行,但是有時也會直接請求某個磁盤文件,如圖片、靜態HTML文件等。默認情況下,MVC框架是先檢測URL能否直接映射到某個磁盤文件,如果不能,然后再把當前請求交給路由系統來處理。如果匹配上了,就是直接繞過路由系統。
    如果我們希望對磁盤文件的映射及一些額外的限制,我們可以改變這個順序,即 ,讓MVC框架先經過路由系統,如果沒有匹配上,再去檢測磁盤文件有沒有匹配。這樣子我們就可以充分利用強大的路由系統了。我們只需要把 rounts 的 RouteExistingFiles 屬性設為true就可以改變這個順序了。
 
public static void RegisterRoutes(RouteCollection routes)
{
        routes.RouteExistingFiles = true;
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
        routes.MapRoute(
            "Default", // 路由名稱
           "{controller}/{action}/{id}", // 帶有參數的 URL
            new { controller = "Home", action = "Index", id = 
                UrlParameter.Optional }, // 參數默認值
        );
}                

 


    
9. 由路由生成URL。
    9.1 通過ActionLink生成超鏈接。 跟通過URL進行路由映射一樣,由路由生成HTML也需要進行路由匹配,並且,只要遇到第一個匹配成功,以后的路由就會被忽略。下面看幾個簡單的例子。生成URL的最簡單並且最常用的辦法是在頁面中通過ActionLink這個輔助方法來完成的。
    @Html.ActionLink("Click to About Page","About") //指定當前控制器的其他 action
    @Html.ActionLink("Click to About Page","About",“myController”)  //指定 controller 和 action
    @Html.ActionLink("Click to About Page","About",“myController”, new { id =  "myId" } )  //指定 controller 、action 以及其他參數
    @Html.ActionLink("Click to About Page","About",“myController”, new { id =  "myId" ,otherVal =value } )  //指定 controller 、action 以及其他參數
    @Html.ActionLink("Click to About Page","About",“myController”, new { id =  "myId" ,otherVal =value }  , new { id=myAnchorID , @class     ="myCss"})
    如果系統只包括默認路由的話,第三個重載會生成  <a  href= " myController/About/myId">Click to About Page</a>
    第四個重載由於默認的路由不包括 otherVal 參數,所以會以查詢字符串的形式出現, <a  href= " myController/About/myId">Click to About Page</a>
    第五個重載加上了一些HTML Attributes  <a  href= " myController/About/myId" id="myAnchorID " class='myCss'>Click to About Page</a>
 
    9.2 如果希望生成不帶超鏈接的URL,可以使用 Action
        @Url.Action("About","myController" , new { id = "myId" })
        生成如下URL myController/About/myId
    
    9.3 通過路由生成超鏈接
    @Html.RouteLink("Click to System About Page",new {controller="myController",action="About",id = "myId" })
 
    10.  區域(Area)
   區域,在企業開發中還是比較常見的,一般用於子系統的開發,每個子系統都是一個完整的MVC框架,一個子系統就是一個區域(Area)
        10.1 新建一個區域
        在建好的MVC項目的解決方案資源管理器中,右擊項目,選擇 添加=>區域 ,然后輸入Admin ,則MVC框架會自動處理剩下的所有工作,包括生成解決方案中的相關目錄和文件,生成 AdminAreaRegistration 類,在Global文件中注冊所有區域等。每個區域都是一個獨立的小系統,可以獨立地完成很多工作。
        10.2 如果我們組要在一個特定的區域內生成本區域的Url,我們不需要考慮區域的因素,MVC框架會自動檢測到當前區域,並且把區域信息添加到URL中。如果我們要鏈接到其他區域,或鏈接到沒有區域的地方,可以使用@Html.ActionLink方法,把area當做一個參數傳遞過去即可。
    鏈接到本區域:@Html.ActionLink("Click to Index","Index")
    鏈接到Admin區域:@Html.ActionLink("Click to Index","Index",new {area="Admin"})
    鏈接到無區域:@Html.ActionLink("Click to Index","Index",new {area=""})
    
    由於MVC框架先注冊了所有區域,又注冊了所有路由,所以,在這里,area 只是一個路由中的參數,這個參數會被路由恰當地處理成我們需要的鏈接,也會從特定的鏈接中提取出恰當的參數。
 
    總之一句話,MVC框架中的路由系統,那是相當強大!
        
    
 
    
    
 
 
 
 
 
 
 


免責聲明!

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



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