如何在 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 Article
,p
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
}
}
我正在尝试实现如下路由样式:
我的域名。com/some-slug-text-a-123
最后一位数字是特定资源的 Id
,前面的 'a'
代表资源。资源可能是 a
for Article
,p
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
}
}