第14章 高级路由特性

----------------------------------------------------------

原则:1.应该首先定义最具体的路由。

    2.建议为URL模式中的所有片段变量都提供值。

注意:1.Html.ActionLink在匹配时,前有打断原则(前面提供值后,后面的变量必须提供值,打断默认值链)

     @Html.RouteLink方法,指定一条路由生成链接(路由name) 

    2.在参数传递给ActionLink方法时,注意将其余变量值传递null。

    3.在区域下面的Web.config中,把<add namespace="System.Web.Optimization"/>去掉  

提示:1.为了使用保留关键字时,要在前面加@符号,如:new{id="Myid",@class="MyCssClass"}

   2.Html.ActionLink 用于生成a标签的链接,Url.Action用于生成URL文件并非链接

*   使用URL方案来生成可以嵌入到视图中的输出URL,以便用户可以点击链接,

并以正确的控制器和动作方法为目标,将表单递给应用程序。(真TM废话,就是用Html.ActionLink等方法生成正确的链接。)

---------------------------------------------------------- 

目录:

  在视图中生成输出URL

  定制路由系统

  使用区域

  URL方案最佳做法

一.出站URL的路由匹配:

   1.考察路由匹配的三个条件:

      (1)URL模式中定义的每一个片段变量都必须有一个可用的值。

      (2)在给片段变量提供的值中,应当没有违背这条路由所定义的未出现的默认变量

    (Default-Only Variables为其提供了默认值,但未在URL模式中出现的变量)的值。(与默认变量)

      (3)所有片段变量的值均必须满足路由约束。

       注:路由系统不会试图查找出最佳匹配的路由。只会找出最先匹配的路由,然后用这条路由生成URL,

  任何后续路由都会被忽略。当满足条件的第一个Route对象产生一个非空URL时,就终止URL生成过程。

  为各个片段参数所选择的参数值将在其中被替换,并忽略尾部的默认值序列

  如果明确地提供了一些参数,但它们与片段参数或默认参数不符,那么该方法将把这些参数以“名字/值”对的查询字符串形式进行追加。

  路由系统会渴望根据一条路由尽可能形成匹配,在这个意义上,它将重用输入URL的片段变量值。

  @Html.ActionLink("输出URL","Index","Home","https","www.baidu.com","myFragementName",new{id="MyId"},new{id="myAnchorID",@class="MycssClass"})

            标签值,action,contorller,     协议值 ,目标服务器名       ,  URL片段                , 片段变量           ,HTML标签属性

  <a href="https://www.baidu.com/Home/Index/MyId#myFragmentName" id="myAnchorID" class="MycssClass">输出URL</a>

  生成URL(不是链接):@Url.Action("Index","Home",new {id="Myid"})  

            string myActionUrl=Url.Action("Index","Home",new {id="Myid"})  

            RedirectToRouteResult result=RedirectToAction("Index")

            RedirectToRouteResult result=RedirectToAction(new {controller="Home",action="index",id="MyId"})

   

二、定制路由系统(在系统扩展时可以用)

  1.自定义RouteBase实现两个方法

    GetRouteData(HttpContextBase httpContext):入站URL匹配机制。框架依次对RouteTable.Routes的每个条目调用这个方法,

  直到其中之一返回一个非空值。

    GetVirturalPath(RequestContext requestContext,RouteValueDictionary values): 出站URL生成机制。框架依次对

  RouteTable.Routes的每个条目调用这个方法,直到其中之一返回一个非空值。  

  2.自定义路由处理程序实现IRouteHandler接口:

    GetHttpHandler(RequestContext requestContext)生成IHttpHandler接口,负责对请求进行处理。

   在该接口的MVC实现中,完成实现了:查找控制器、调用动作方法、渲染视图、并将结果定写入到响应中去。


三、使用区域

  每个区域代表应用程序的一个功能段。每个MVC区域有自己的文件夹结构,能够保持事物分离。

这会使项目元素与应用程序的每个功能区的相关性更加明显,有助于多个开发人员在同一个项目上工作而不会引起相互冲突。

区域能过路由系统得到广泛的支持。

  区域在Areas文件夹下创建,以区域名(如Admin)作为子区域文件夹,并包括Controller、Models、Views文件夹。

Views文件夹下包括Shared文件夹和Web.config文件。有了一个名为“AdminAreaRegistration”类。

AdminAreaRegistration类定义了RegisterArea方法,注册了一个URL模式为Admin/{controller}/{action}/{id}的路由。

在Global.asax调用区域注册: AreaRegistration.RegisterAllAreas();


四、URL方案最佳方法

  1.URL整洁和人性化

    (1)设计URL来描述它们的内容,而不是应用程序的细节。例:/Articles/AnnualReport ,而不是/Website_v2/CachedContentserver/FromCache/AnnualReport

    (2)尽可能采用内容而不是ID号。例:/Articles/AnnualReport,而不是/Articles/2392

  如果必须要使用ID号请将内容加上。      /Articles/2392/AnnualReport        

    (3)不要对HTML页面使用文件扩展名,特殊文件类型除外(.jpg,.pdf,.zip)

    (4)创建一种层次感。例:/Products/Menswear/Shirts/Red ,这样可以猜出父目录的URL。

    (5)不区分大小写。ASP.NET路由系统默认是不区分大小写的。

    (6)避免使用符号、代码、字符序列。单词分隔用“-”短横(my-great-article),不建议用下划线。千万不能用空格。

    (7)不要修改URL。打破链接等于失去商务。必须要修改时,通过永久重定向(301)尽可能长时间地继续支持旧式的URL方案。

    (8)具有一致性。在整个应用程序中采用一种URL格式。URL应该简短、易输入、可剪辑,且持久稳定,形象化网站结构。

  2.Get和post使用选择:

    get请求应该被用于所有只读信息检索(安全交互),post请求应该被用于所有修改程序状态的操作(更改交互)。

    

   

    

    

  

原文地址:https://www.cnblogs.com/wjs5943283/p/4638723.html