如何在 asp.net 内核中实现 in-url 路由?

How can I achieve a in-url routing in asp.net core?

我正在尝试实现如下路由样式:

我的域名。com/some-slug-text-a-123

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

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

很抱歉,如果这是一个基于意见的问题,但不知道还能问什么。

您可以通过多种方式实现这一目标。我会给你两个例子,但我建议看看 Asp.Net Routing documentation

选项 1 (Multiple Convetional Routes)

在 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 (Attribute routing)

在 Startup.cs(方法 Configure)上映射新路线约定

app.UseEndpoints(endpoints =>
{

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

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

    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
        }
    }