asp.net core mvc之路由

一、默认路由 (Startup.cs文件)

cs 复制代码
routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}"
);

默认访问可以匹配到

https://localhost:44302/home/index/1

https://localhost:44302/home/index

https://localhost:44302/home

https://localhost:44302

也可以匹配到
https://localhost:44302/course/learn/1

1、创建 course 控制器

Controllers文件夹下右键-,添加控制器->

-》CourseController.cs

->

2、创建learn视图

在Views文件夹下,新建 Course 文件夹,然后右键 。 添加-》视图-》learn.cshtml

cs 复制代码
@{
    ViewData["Title"]= "学习";
}

<h1>学习页面内容</h1>

二、案例博客路由

1、在 Startup.cs 文件下配置博客路由

cs 复制代码
//防止输入https://localhost:44302/home跳到博客专用路由
routes.MapRoute(
        name: "home",
        template: "home", //https://localhost:44302/home,跳到Home控制器中Index方法
        defaults: new { controller = "Home", action = "Index" }
       );

//博客专用路由
routes.MapRoute(
        name:"blog",
        template:"{name}", //https://localhost:44302/博客名,跳到Blog控制器中Index方法
        defaults: new { controller ="Blog",action="Index"}
       );

2、Controllers文件夹右键,添加-》控制器 BlogController.cs

cs 复制代码
    public class BlogController : Controller
    {
        public IActionResult Index(string name)
        {
            ViewData["BlogName"] = name;
            return View();
        }
    }

3.Views文件夹下添加Blog文件夹右键,添加-》视图 Index.cshtml

cs 复制代码
<h1>@ViewData["BlogName"]博客</h1>

三、特性路由

特性路由:在Action添加标注,来指定路由规则

1、Startup.cs 文件中 app.UseMvc(删除全部路由);

2、在Action添加标注

cs 复制代码
public class HomeController : Controller
{
        [Route("")]
        [Route("home")]
        [Route("home/index")]
        public IActionResult Index()
        {
            return View();
        }
        [Route("home/abc")]//https://localhost:44302/home/abc
        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }
}

注意:

A、如果2个方法有相同标注,为防止冲突,可以这样做

[HttpPost("home/abc")]

B、特性路由参数

cs 复制代码
//学习
[Route("course/learn/{id}")] //https://localhost:44302/course/learn/1
public IActionResult learn(int id)
{
    return View();
}

四、组合路由

组合路由:在 Controller 和Action 上添加路由标注

cs 复制代码
//课程
[Route("c")]
public class CourseController : Controller
{

    [Route("index")] //    https://localhost:44302/c/index
    [Route("/idd")] // 以/开头的不是组合路由  https://localhost:44302/idd
    public IActionResult Index()
    {
       return View();
    }
}

五、路由模板中使用标记替换

在路由模板中使用

controller\] 表示和控制器同名的名称 \[action\] 表示和Action同名的名称 \[area\] 表示和区域同名的名称 ```cs [Route("[controller]")] public class CourseController : Controller { [Route("[action]")] // https://localhost:44302/course/index public IActionResult Index() { return View(); } } ``` 还可以在控制器上面使用多个路由特性,实现多个地址匹配一个控制器 ```cs [Route("[controller]")] [Route("more")] // https://localhost:44302/more/index public class CourseController : Controller { [Route("[action]")] // https://localhost:44302/course/index public IActionResult Index() { return View(); } } ``` 还可以这样写 ```cs [Route("[controller]/[action]")] //https://localhost:44302/course/index //也可以放到方法上 public class CourseController : Controller { public IActionResult Index() { return View(); } } ``` ## 六、自定义路由特性 通过创建一个实现了IRouteTemplateProvider的类。然后在类里面配置Template和Order还有Name这三个属性就可以实现特性标注了。 只要那个类或者Action增加了这个自定义标注就可以自动设置上面的Template特性。 #### 1、在项目下添加 core 文件夹,然后添加 MyRouteAttribute.cs 类,实现 IRouteTemplateProvider ```cs namespace FirstCoreMvc.core { public class MyRouteAttribute : Attribute, IRouteTemplateProvider { public string Template => "www/[controller]/[action]"; public int? Order {get;set;} public string Name { get; set; } } } ``` 2、调用 ```cs public class BlogController : Controller { [MyRoute] //https://localhost:44302/www/blog/index public IActionResult Index(string name) { ViewData["BlogName"] = name; return View(); } } ``` ## 七、生成Url 生成url,实际应用在**视图中生成链接的地址** ```cs public IActionResult Index() { //return Content(Url.Action("index")); // /home //return Content(Url.Action("index", "home")); // /home return Content(Url.Action("index", "course", new { id = 1, name = "lili" })); // /course/index/1?name=lili 和我想像/course/index?id=1&1name=lili不一样,有人知道吗? } ``` ## 八、区域的使用 #### 1、点击项目右键-》添加-》新搭建基架的项目-》MVC区域-》添加-》区域名称:Manage ![](https://file.jishuzhan.net/article/1722771717606084610/b2b787387f08d7b5ac2cb3a563f0d94b.webp) #### 2、添加控制器视图 ```cs namespace FirstCoreMvc.Areas.Manage.Controllers { [Area("Manage")] //需要添加区域注释,否则会和外边路由冲突 public class HomeController : Controller { public IActionResult Index() { return View(); } } } ``` **注意:\[Area("Manage")\] 需要添加区域注释,否则会和外边路由冲突** #### 3、startup.cs文件中路由设置 ```cs //区域路由 放到上面 routes.MapAreaRoute("mange_area","Manage","manage/{controller=Home}/{action=Index}/{id?}"); ```

相关推荐
weixin_4624462313 分钟前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL32 分钟前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小信啊啊1 小时前
Go语言切片slice
开发语言·后端·golang
北城以北88883 小时前
Spring定时任务与Spring MVC拦截器
spring boot·spring·mvc
Victor3563 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易3 小时前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee
Kiri霧3 小时前
Range循环和切片
前端·后端·学习·golang
WizLC3 小时前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Victor3563 小时前
Netty(19)Netty的性能优化手段有哪些?
后端
爬山算法3 小时前
Netty(15)Netty的线程模型是什么?它有哪些线程池类型?
java·后端