zoukankan      html  css  js  c++  java
  • ASP.Net Core -- 属性路由

    属性路由示例

    今天讨论 ASP.NETCoreMVC 中的属性路由

    在Startup.cs中使用UseMvc()方法:请注意,我们使用UseMvc()方法,所以不包含默认路由模板,无法进行参数传递

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseStaticFiles();
    
                app.UseMvc();
    
            }

    使用属性路由,我们使用Route()属性来定义路由。我们可以在Controller或 Controller 的操作方法上应用Route属性。

    public class DepartmentController : Controller
        {
            [Route("")]
            [Route("Department")]
            [Route("Department/List")]
            public string List()
            {
                return "你好,我是list";
            }
            public string Infor()
            {
                return "你好,我是infor";
            }
        }

    List()操作方法上指定了 3 个不同的Route()属性。对于Route()属性的每个实例,我们指定了不同的路由模板。使用这 3 个路由模板,3 个 URL 路径中,都会访问 DepartmentController的 List()操作方法。

    使用这 3 个路由模板,当遇到以下 3 种 url 地址进行访问DepartmentController的List()操作方法的时候,都会匹配成功,进入方法内。

    属性路由参数

    使用传统路由,我们可以将路由参数指定为路由模板的一部分,比如,在Index()中传一个主键等等。 当然属性路由也可以做同样的事情。 

     public class DepartmentController : Controller
        {
            private readonly IStudentRepository _studentRepository;
    
            //使用构造函数注入的方式注入IStudentRepository
            public DepartmentController(IStudentRepository studentRepository)
            {
                _studentRepository = studentRepository;
            }
    
            [Route("Home/Details/{id}")]
            public IActionResult Details(int id)
            {
                //实例化HomeDetailsViewModel并存储Student详细信息和PageTitle
                HomeDetailsViewModel homeDetailsViewModel = new HomeDetailsViewModel()
                {
                    Student = _studentRepository.GetStudent(id),
                    PageTitle = "学生详细信息"
                };
    
                return View(homeDetailsViewModel);
            }
        }

    Details ()操作方法具有 id 参数。此参数根据指定的 id 来查询学生的详细信息 。请注意, 在路由模板中, 我们指定了 id 参数。因此, URL (/Department/Details)将执行Details (int id)操作方法, 并将值"1"映射到Details(int id)的"id"参数

    属性路由可选参数

    当前,当我们在URL(/ Department/ Details / 1)中具有“id”路由参数的值时,才执行DepartmentControllerDetails(int id)操作方法。 如果 id 值不在 URL 中,我们得到 404. 例如,URl / Department/ Details不会执行Details(int id)操作方法。 而是显示 404 错误。 要使路由参数“id”可选,只需在末尾添加“?” 即可。

    public class DepartmentController : Controller
        {
            private readonly IStudentRepository _studentRepository;
    
            //使用构造函数注入的方式注入IStudentRepository
            public DepartmentController(IStudentRepository studentRepository)
            {
                _studentRepository = studentRepository;
            }
    
            [Route("Home/Details/{id?}")]
            public IActionResult Details(int id)
            {
                //实例化HomeDetailsViewModel并存储Student详细信息和PageTitle
                HomeDetailsViewModel homeDetailsViewModel = new HomeDetailsViewModel()
                {
                    Student = _studentRepository.GetStudent(id),
                    PageTitle = "学生详细信息"
                };
    
                return View(homeDetailsViewModel);
            }
        }

    控制器和操作方法名称

    在属性路由中,控制器名称和操作方法名称,不会影响路由属性名称,他们没有强关联关系。 路径名称我们自己定义,然后根据自己的定义进行查找对应的控制器和方法。

    public class DepartmentController : Controller
    {
        [Route("")]
        [Route("Home")]
        [Route("Home/Index")]
        public ViewResult Department()
        {
            return View();
        }
    }

    通过以下三种方式依然可以查找到:

    /
    /Home
    /Home/Index

    属性路由支持层次结构

    在 HomeController 类上应用Route()属性,如下所示。主要降低代码重复

    namespace StudentManagement.Controllers
    {
        [Route("Department")]
        public class DepartmentController : Controller
        {
            [Route("/")]
            [Route("List")]
            public string List()
            {
                return "你好,我是list";
            }
    
            [Route("Infor/{id}")]
            public string Infor(int id)
            {
                return "你好,我是infor";
            }
        }
    }

    这样,项目启动,就会直接找到Department控制器下的List方法,如果[Route("/")]中不加斜杠,直接启动项目会报错,说找不到页面,需要带上控制器名称才能找到,加上的话直接启动就会找到

    属性路由中自定义路由

    [Route("[controller]")]
    public class DepartmentController : Controller
    {
        [Route("[action]")]
        public string List()
        {
            return " DepartmentController控制器中的List()方法";
        }
    
        [Route("[action]")]
        public string Details()
        {
            return " DepartmentController控制器中的Details()方法";
        }
    }

    使用 controller 和 action 标记,在 URL 路径中的/Departments/List将进入DepartmentsController中执行List()方法。 类似地,在 URL 路径中的/ Departments / Details将进入DepartmentsController中执行Details()方法。如果我们要进行重命名控制器或动作名称,我们就不必更改路径模板。

    要使 List()方法成为 DepartmentController 的默认路由入口,可以使用空字符串包含的 Route(“”)属性,如下所示。

    [Route("[controller]")]
    public class DepartmentController : Controller
    {
        [Route("[action]")]
        [Route("")] // 使 List()成为默认路由入口
        public string List()
        {
            return " DepartmentController控制器中的List()方法";
        }
    
        [Route("[action]")]
        public string Details()
        {
             return " DepartmentController控制器中的Details()方法";
        }
    }

    我们最好在控制器上只设置一次,而不是在控制器中的每个操作方法中包含[action]标记,如下所示

    [Route("[controller]/[action]")]
    public class DepartmentController : Controller
    {
        public string List()
        {
              return " DepartmentController控制器中的List()方法";
        }
    }

    这样减少代码重复。

  • 相关阅读:
    一个关于Delphi XML处理单元的BUG
    弹出一个非阻塞对话框
    更新Delphi中SVN客户端版本的方法
    程序只允许运行一个+重复运行程序提前
    Reverse Words in a String
    How to define Servlet filter order of execution using annotations
    Understanding and Using Servlet Filters
    Observer Pattern
    javascript 比较
    SOAP vs REST
  • 原文地址:https://www.cnblogs.com/dcy521/p/13336143.html
Copyright © 2011-2022 走看看