物性路由:將路由和控制器放在一起,這樣更簡單方便,還可以處理複雜的路由場景
傳統路由:集中、強制、基於代碼風格來定義的。
每個MVC應用程序都需要路由來定義自己的處理請求方式,路由是MVC是應用程序的入口點。我們先了解一下路由涉及的主要概念:路由定義是從URL模板開始的,因爲它指定了與路由相匹配的模式。路由定義可以做爲控制器類或操作方法的特性。路由可以指定的它的URL及其默認值,此外,它還可以約束URL的各個部分,提供關於路由如何及何時與傳入的URL相匹配的嚴格控制。
創建一個MVC程序後,我們可以在Application_Start/RouteConfig.cs文件中。因爲我們這次主要講特性路由,所以可以先刪除裏面默認的所有內容,通過MapMvcAttributeRout()方法來定義。
在HomeController中隨便找一個視圖前面加上[route("")],我這裏用的是about,定義的路由名爲”aboutTest“
[Route("aboutTest")]
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
URL用這個訪問:http://localhost:8957/ceshi
*這些URL就不要寫home/ceshi了,因爲我們已經定義路由,直接輸入就可以訪問
控制器路由:前面看了如何把路由特性直接添加到操作方法上,但很多時侯控制器類中的方法遵循的模式具有相似的路由特情,這裏我們可以定一下action的特殊路由參數,以後該控制器下的路由就不用重複寫相似的代碼了
/// <summary>
/// 定義路由映射
/// </summary>
[Route("{home}/{action}")]
public class HomeController : Controller
{
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
}
URL:http://localhost:8957/home/About
當然用這種方式後,控制器上也可以添加特性路由,也是可以訪問的
我們也可以使用前綴“RoutePrefix”
/// <summary>
/// 定義路由映射--使用前綴
/// </summary>
[RoutePrefix("home")]
[Route("{action}")]
這樣程序會幫我們自動加上“home”控制器的前綴,兩者皆支持覆蓋行爲,即爲一個控制器指定多個路由規則:
[Route("")]
[Route("default")]
public ActionResult Index()
{
return View();
}
http://localhost:8957/home/default
這兩條URL都可以訪問到同一個控制器
* [Route("{home}/{action}")]:用這種方式,控制器前臺有指定路由,URL訪問不用輸入控制器的前綴例:
這兩條URL訪問的都是Index控制器。如果沒有爲控制器添加特性路由,在訪問時就要添加控制器的名字(前綴)
例:http://localhost:8957/home/About 這條URL訪問的是“About”控制器
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
路由約束:當我們使用帶有參數的路由時,會發現如果我們想讓相同的路由,不同的參數分別訪問不同的控制器時,我們就要用到路由約束
[Route("ceshi/{id:double}")]
public ActionResult Test1(string id)
{
return View();
}
URL: http://localhost:8957/ceshi/3.14/
下面的圖片是內聯表,我偷個懶,切了一張圖片;
(未完,待續)