ASP.NET MVC 路由

一丶路由

       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}")]
    [Route("Home/{action=Index}/{id?}")]
public class HomeController : Controller { public ActionResult Index() { return View(); } }}

  可以看出当在浏览器中输入/home时会默认为Index方法。
{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 }
            );
        }
    }

   controller="Home" ,action="Index" 这儿代表的是默认值
   传统路由的约束:

new { controller="xxxx",action="xxx"} ,这儿的xxx代表正则表达式。
其实传统路由跟特性路由功能都差不多,底层都是维护的一个路由字典对象,特性路由更加具体,
传统路由更加广泛,可以在程序中使用这两种方式,建议把特性路由模式放在传统路由的前面,当在
特性路由中没有查找到匹配路由,那么就会在传统路由中去查找匹配,当匹配到了后不再继续往下匹配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值