asp.net core 系列 6 路由(中)_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

一.URL 天生

  接着上篇讲MVC的路由,MVC 运用程序能够运用路由的 URL 天生功用,天生指向操纵的 URL 链接。 天生 URL 可消弭硬编码 URL,使代码更稳固、更容易保护。 此局部重点引见 MVC 供应的 URL 天生功用,而且仅涵盖 URL 天生事情道理的基本知识。 IUrlHelper 接口用于天生 URL,是 MVC 与路由之间的基本构造的基本局部。 在控制器、视图和视图组件中,可经由过程 Url 属性找到 IUrlHelper 的实例。

        //
        // mvc 框架的ControllerBase类下
        //择要:
        //     Gets or sets the Microsoft.AspNetCore.Mvc.IUrlHelper.
        public IUrlHelper Url { get; set; }

  

  1.1 传统路由下的url天生

    下面示例中,经由过程运用IUrlHelper接口在index页面天生指向另外一操纵Destination的 URL超衔接。

        [Route("Home/Index")]
        public IActionResult Index()
        {
            // Generates /Home/Destination
            var url = Url.Action("Destination");
            var urlAddress = "<a href=""   url   ""  >Click on to the Destination</a>";
            ViewData["url"] = urlAddress;
            return View();
        }

        public IActionResult Destination()
        {
            return View();
        }

       // Index.cshtml     
      @Html.Raw(ViewData["url"].ToString())

    当加载index页面后,点击超衔接"Click on to the Destination" 将进入背景控制器的Destination操纵中。

    上面的 Url.Action 示例假定运用传统路由,但 URL 天生功用的事情方式与属性路由类似,只不过观点分歧。 在传统路由中,路由值用于扩大模板。controller 和 action 的路由值一般出现在该模板中, 这类做法可行是由于经由过程路由婚配的 URL 恪守某项商定。 这里的扩大模板指的是routes.MapRoute来增加路由划定规矩商定。

 

  1.2 属性路由下的url天生

    在属性路由中,controller 和 action 的路由值不克不及出现在模板中(也就是不会运用routes.MapRoute),它们用于查找要运用的模板。

      //起首不消传统路由,去掉了routes.MapRoute
      public void Configure(IApplicationBuilder app)
        {
            app.UseMvc();
        }

        [Route("")]
        public IActionResult Index()
        {
            // Generates /custom/url/to/destination 
            var url = Url.Action("Destination");
            var urlAddress = "<a href=""   url   ""  >" url "</a>";
            ViewData["url"] = urlAddress;
            return View();
        }

        [HttpGet("custom/url/to/destination")]
        public IActionResult Destination()
        {
            return View();
        }
    

     天生如下图所示 :以是会天生与httpget设置装备摆设的途径一样,是由于属性路由下的url天生,它们用于查找要运用的模板。MVC 天生一个包罗统统属性路由操纵的查找表,并婚配 controller 和 action 的值,以挑选要用于天生 URL 的路由模板。

  1.3 依据action称号天生 URL

    Url.Action (IUrlHelper . Action) 和统统相干重载都基于如许一种设法主意:用户想经由过程指定控制器称号和操纵称号来指定要链接的内容。

        [Route("")]
        public IActionResult Index()
        {
            // Generates /Home/Destination/1?color=red
            var url = Url.Action("Destination","Home",new  { id=1 , color="red"});
            var urlAddress = "<a href=""   url   ""  >"   url   "</a>";
            ViewData["url"] = urlAddress;
            return View();
        }

       
        public IActionResult Destination(int id,string color)
        {
            return View();
        }    

  1.4 依据路由称号天生 URL

    IUrlHelper 还供应 Url.RouteUrl 系列的要领。 这些要领类似于 Url.Action。Url.RouteUrl 指定一个路由称号,以运用特定路由来天生 URL,一般不指定控制器或操纵称号。

        [Route("")]
        public IActionResult Index()
        {
            // Generates /custom/url/to/destination
            var url = Url.RouteUrl("Destination_Route");
            var urlAddress = "<a href=""   url   ""  >Click on to the Destination</a>";
            ViewData["url"] = urlAddress;
            return View();
        }

        [HttpGet("custom/url/to/destination", Name = "Destination_Route")]
        public IActionResult Destination()
        {
            return View();
        }

  1.5  别的天生

     (1)在 HTML 中天生 URL: IHtmlHelper 供应 HtmlHelper 要领 Html.BeginForm 和 Html.ActionLink,可分别天生 <form> 和 <a>元素。 这些要领运用 Url.Action 要领来天生 URL,而且接纳类似的参数。

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

    (2)在action中重定向:RedirectToAction("Index"); 

 

二. area区域路由

    区域是一种 MVC 功用,用于将相干功用整理到一个组中,作为零丁的路由定名空间(用于控制器操纵)和文件夹构造(用于视图)。 经由过程运用区域,运用程序能够有多个称号雷同的控制器,只需它们具有分歧的区域。 经由过程向 controller 和 action 增加另外一个路由参数 area,可运用区域为路由建立条理构造。

    下面是mvc文件构造,关于users控制器,在视图层多了一级Manage文件夹。怎样使users控制器中AddUser操纵联系关系AddUser.cshtml呢,下面运用区域路由来完成:

          app.UseMvc(routes =>
            {
                //用于名为 Blog 的区域
                routes.MapAreaRoute("blog_route", "Blog","Manage/{controller}/{action}/{id?}");
                /*
                 * 解释的MapRoute与上面的区域路由作用一样
                routes.MapRoute("blog_route", "Manage/{controller}/{action}/{id?}",
                defaults: new { area = "Blog" }, constraints: new { area = "Blog" });
                */
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        //控制器上运用区域路由
       [Area("Blog")]      public class UsersController : Controller      {    // GET: /<controller>/      public IActionResult AddUser()      {   return View();      }      }

    在浏览器中输入/Manage/Users/AddUser 将自动进入AddUser()中,这是由于以后路由:Manage/{controller}/{action}/{id?}相符blog模板,以是运用Blog区域路由。

  

 三. IActionConstraint 路由束缚

    完成IActionConstraint最简朴的要领是建立派生自 System.Attribute 的类,并将其置于操纵和控制器上。MVC 将自动发明任何运用属性IActionConstraint的操纵和控制器。

    鄙人面的示例中,束缚基于路由数据中的国度/区域代码挑选操纵,开发人员卖力完成Accept 要领,当路由中id值为en-US时Accept 要领返回 true 以透露表现该操纵是婚配项,统统按一般剖析返回客户端。 若是Accept 要领返回false将不实行IActionConstraint符号的action,向客户端返回404毛病。

//界说ActionConstraint属性束缚
public class CountrySpecificAttribute : Attribute, IActionConstraint
    {
        private readonly string _countryCode;

        public CountrySpecificAttribute(string countryCode)
        {
            _countryCode = countryCode;
        }

        public int Order
        {
            get
            {
                return 0;
            }
        }

        public bool Accept(ActionConstraintContext context)
        {
            return string.Equals(
                context.RouteContext.RouteData.Values["id"].ToString(),
                _countryCode,
                StringComparison.OrdinalIgnoreCase);
        }
    }
      //运用路由的action束缚,而且路由中id值为en-US
       [CountrySpecific("en-US")]
        public IActionResult Privacy(string countryCode)
        {
            return View();
        }

    在浏览器测试时:若是输入http://localhost:30081/home/Privacy/zh-cn,则网页显现404。若是输入http://localhost:30081/home/Privacy/en-US 则相符束缚,网页显现一般。

 

 

  参考文献

  官方材料:asp.net core routing

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。