asp.net - 如何在 asp.net core 中实现 in-url 路由?
问题描述
我正在尝试实现一种路由样式,例如:
mydomain.com/some-slug-text-a-123
最后一个数字是Id
特定资源的数字,'a'
前面的数字将代表资源。资源可能是a
for Article
,p
forProduct
等等。显然,对于每个资源,我都有一个单独的控制器,我的挑战从这里开始。
在这种情况下,除了使用 Home 控制器并根据提供的资源提供所有内容之外,是否有特定于该场景的路由配置?
如果这是一个基于意见的问题,我很抱歉,但不知道该怎么问。
解决方案
您有多种方法可以实现这一目标。我会给你两个例子,但我建议看看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
}
}
推荐阅读
- web-scraping - 使用 Scrapy 获取结构化输出
- c++ - OpenVINO 演示:多通道人脸检测演示;TBB LINK 2019 错误
- java - 是否有可能有一个“HotReload”基于 docker 的 java 环境?
- c++ - 构造函数与数组初始值设定项的歧义
- swiftui - 如何将全局应用程序状态桥接到模型视图(使用@ObservedObject)?
- docker - docker ps 仅列出名称和状态
- azure - Azure 函数保存到没有内容标题的文件
- python - 使用python将十六进制地址.xlsx文件转换为csv int
- java - 改变弹出菜单背景颜色(以编程方式)
- reactjs - 在ant设计表选择中通过getCheckboxProps设置defaultChecked有什么问题?