一丶路由
1.关于URL。
对于高质量的URL应该满足以下几点要求:
域名便于拼写和记忆。
简短。
便于输入。
可以反射出站点结构。
持久丶不能改变。
传统的URL对应是磁盘上的物理文件。URL和文件系统之间的一一对应的关系就不能适用于大部分基于MVC的WEB框架。这些框架应用不同的方法把URL到某个类的方法,而不是映射到磁盘的某个物理文件上面。
2.路由和URL重写
URL重写
将请求的url重写成服务器可以处理的url形式。然后由服务器根据重写后的url,查找出可以处理重写后的url的Handler,最后由Handler对其进行处理。
路由
检测url是否是需要处理的格式。然后直接指定Handler对重写后的url进行处理
3.路由方法
MVC一直支持使用集中的丶强制的丶基于代码风格类定义的路由,我们将其称为传统路由,MVC5添加了另一个在控制器类或者操作方法上使用声明式特性的选项,称为特性路由。这个新选项更加简单,并且交路由URL与控制器代码放在了一起。两种选项都能很好的工作,并且都十分灵活,能够处理复杂的路由场景。
3.1 特性路由
在RouteConfig中配置
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcAttributeRoutes();
}
路由的核心工作是将一个请求映射到一个操作上面,我们现在要在一个操作方法上面加一个特性
[Route("Abouts")]
public ActionResult About()
{
ViewBag.Message = "我是通过特性路由进来的~~~~~~~";
return View();
}
对于操作有多个URL 就使用多个路由特性
[Route("")]
[Route("Home")]
[Route("Home/Abouts")]
public ActionResult About()
{
ViewBag.Message = "我是通过特性路由进来的~~~~~~~";
return View();
}
传入的路由特性字符串叫路由模板,它就是一个模式匹配,决定了这个路由是否适用于传入的请求,如果匹配运行此操作方法。
上面的路由都是一些简单的,静态路由,但是实际开发中很多都不是静态的路由。如:获取某个的信息,就要传入一个ID。
介绍一下如何通过路由参数来解决这个问题:
[Route("Details/{id}")]
public ActionResult Details(int id)
{
ViewBag.Message = id.ToString();
return View("About");
}
上面的{}括号代表点位符。
以上的路由特性都是放在的操作方法上面,但有时候,我们在控制器中的方法遵循的模式具有相似的路由模板。而且上面在每个方法上面添加特性是很麻烦的,而且重复。以下的方法就比较简单
[Route("Home/{action=Index}/{id:int}")]
public class HomeController : Controller { public ActionResult Index() { return View(); } }} 可以看出当在浏览器中输入/home时会默认为Index方法。[Route("Home/{action=Index}/{id?}")]
{id:int}为路由约束,当ID为一个Int值时才会匹配。
{id?}表示可选参数。
以上就是特性路由的基础。
3.2 传统路由
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
传统路由的约束:
new { controller="xxxx",action="xxx"} ,这儿的xxx代表正则表达式。
其实传统路由跟特性路由功能都差不多,底层都是维护的一个路由字典对象,特性路由更加具体,
传统路由更加广泛,可以在程序中使用这两种方式,建议把特性路由模式放在传统路由的前面,当在
特性路由中没有查找到匹配路由,那么就会在传统路由中去查找匹配,当匹配到了后不再继续往下匹配。