首页 > 解决方案 > 如何在 asp.net core 中实现 in-url 路由?

问题描述

我正在尝试实现一种路由样式,例如:

mydomain.com/some-slug-text-a-123

最后一个数字是Id特定资源的数字,'a'前面的数字将代表资源。资源可能是afor ArticlepforProduct等等。显然,对于每个资源,我都有一个单独的控制器,我的挑战从这里开始。

在这种情况下,除了使用 Home 控制器并根据提供的资源提供所有内容之外,是否有特定于该场景的路由配置?

如果这是一个基于意见的问题,我很抱歉,但不知道该怎么问。

标签: asp.netasp.net-coreroutesasp.net-mvc-routing

解决方案


您有多种方法可以实现这一目标。我会给你两个例子,但我建议看看Asp.Net Routing 文档

选项 1(多条传统路线

在 Startup.cs 上映射新的路由约定(方法Configure

app.UseEndpoints(endpoints =>
{
    // Map articles (a)
    endpoints.MapControllerRoute(name: "a",
                pattern: "{*slug}-a-{*id}",
                defaults: new { controller = "Blog", action = "Article" });

    // Map products (p)
    endpoints.MapControllerRoute(name: "p",
                pattern: "{*slug}-p-{*id}",
                defaults: new { controller = "Store", action = "Product" });

    // Default routing
    endpoints.MapControllerRoute(name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
});

创建一个控制器和动作来接收在你的路由对流中设置的参数:

    public class BlogController : Controller
    {
        [HttpGet]
        public ActionResult Article(string slug, int id)
        {
            // Your code here
        }
    }

选项 2(属性路由

在 Startup.cs 上映射新的路由约定(方法Configure

app.UseEndpoints(endpoints =>
{

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

将属性添加[Route("")]到您的控制器和/或操作。我将属性放在操作上以简化示例

    public class BlogController : Controller
    {
        [Route("/{slug}-a-{id}")] 
        public ActionResult Article(string slug, int id)
        {
            // Your code here
        }
    }

    public class StoreController : Controller
    {
        [Route("/{slug}-p-{id:int}")] // ":int means that the route will only accept an valid integer on this route; otherwiase will return NotFound
        public ActionResult Product(string slug, int id)
        {
            // Your code here
        }
    }


推荐阅读