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

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?}");
相关推荐
YIAN8 小时前
从手写 Agent 工具到 MCP 协议:一文搞懂大模型跨进程跨语言工具调用
后端·agent·mcp
小兔崽子去哪了9 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
高明珠9 小时前
麒麟 V10 SP1 排查实录:ttyS5 每 10 秒莫名收到一批报文,元凶是 eGTouchD
后端
卷无止境9 小时前
Python FFI 技术深度解析:ctypes、cffi 与 pybind11 的性能差异与实践挑战
后端·python
ServBay10 小时前
AI Gateway 是什么?为什么每个平台都在做
后端·aigc·ai编程
SamDeepThinking10 小时前
Vibe Coding最重要的是Spec
后端·程序员·ai编程
掘金_答案10 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
妙码生花10 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十三):权限规则管理器
后端·go·gin
Kim_wang11 小时前
agent项目部署流程
人工智能·后端
程序员天天困11 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端